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 November 01 via api from US

Summary

This website contacted 72 IPs in 9 countries across 64 domains to perform 255 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 151.101.14.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
3 188.40.16.106 24940 (HETZNER-AS)
9 178.19.70.100 29551 (HGCOMP-ASN)
4 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f11... 32934 (FACEBOOK)
14 2a00:1450:400... 15169 (GOOGLE)
4 13.224.199.29 16509 (AMAZON-02)
4 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.103.65 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
5 2a00:1450:400... 15169 (GOOGLE)
9 2a00:1450:400... 15169 (GOOGLE)
4 178.19.72.20 29551 (HGCOMP-ASN)
2 5 104.109.82.87 20940 (AKAMAI-ASN1)
1 18 172.217.16.130 15169 (GOOGLE)
1 54.230.95.203 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
1 1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
6 27 151.101.14.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
7 136.243.33.79 24940 (HETZNER-AS)
3 7 2.19.43.224 20940 (AKAMAI-ASN1)
6 2.18.234.72 16625 (AKAMAI-AS)
1 18.185.187.173 16509 (AMAZON-02)
2 52.219.73.52 16509 (AMAZON-02)
2 151.101.113.194 54113 (FASTLY)
6 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.218.7 16509 (AMAZON-02)
3 143.204.101.52 16509 (AMAZON-02)
1 2.16.122.151 20940 (AKAMAI-ASN1)
3 69.173.144.140 26667 (RUBICONPR...)
2 3 185.33.223.210 29990 (ASN-APPNEXUS)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 184.30.220.71 20940 (AKAMAI-ASN1)
7 185.22.221.117 60955 (WAVECON)
14 151.101.114.49 54113 (FASTLY)
2 2 18.196.229.216 16509 (AMAZON-02)
1 1 69.173.144.165 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
2 2 185.29.135.181 30419 (MEDIAMATH...)
1 1 151.101.112.166 54113 (FASTLY)
1 1 216.58.207.66 15169 (GOOGLE)
2 2 34.251.1.224 16509 (AMAZON-02)
1 1 52.42.6.223 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 54.93.202.190 16509 (AMAZON-02)
1 1 193.0.160.128 54312 (ROCKETFUEL)
2 176.9.51.135 24940 (HETZNER-AS)
1 178.250.2.130 44788 (ASN-CRITE...)
1 148.251.47.137 24940 (HETZNER-AS)
1 52.28.163.57 16509 (AMAZON-02)
2 35.157.25.58 16509 (AMAZON-02)
1 2.18.233.180 16625 (AKAMAI-AS)
1 104.109.78.125 20940 (AKAMAI-ASN1)
1 151.101.13.108 54113 (FASTLY)
11 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 37.157.6.252 198622 (ADFORM)
3 34.246.21.201 16509 (AMAZON-02)
1 2 89.163.159.115 24961 (MYLOC-AS)
1 62.168.44.118 5588 (GTSCE GTS...)
4 3.248.138.214 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 34.95.76.218 15169 (GOOGLE)
1 89.163.159.124 24961 (MYLOC-AS)
1 2600:9000:21f... 16509 (AMAZON-02)
1 63.34.92.224 16509 (AMAZON-02)
1 108.128.71.27 16509 (AMAZON-02)
255 72
Apex Domain
Subdomains
Transfer
42 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
538 KB
32 giga.de
www.giga.de
static.giga.de
crops.giga.de
videos.giga.de
ssl.2.damoh.giga.de
ssl.1.damoh.giga.de
531 KB
22 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
293 KB
14 google-analytics.com
www.google-analytics.com
40 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
187 KB
10 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
125 KB
8 googletagservices.com
www.googletagservices.com
202 KB
7 oadts.com
media.oadts.com
122 KB
7 scorecardresearch.com
sb.scorecardresearch.com
4 KB
7 meetrics.net
lb14.s400.meetrics.net
2 KB
6 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
12 KB
6 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
3 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
21 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
27 KB
5 rubiconproject.com
fastlane.rubiconproject.com
pixel.rubiconproject.com
eus.rubiconproject.com
5 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 pubstack.io
boot.pubstack.io
cdn.prod.pubstack.io
intake.prod.pubstack.io
20 KB
4 adnxs.com
ib.adnxs.com
acdn.adnxs.com
4 KB
4 giga-abs.de
go.giga-abs.de
2 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
89 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 yieldlove-ad-serving.net
tracking.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
610 B
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
63 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 consensu.org
cmp.teads.mgr.consensu.org
2 adsrvr.org
match.adsrvr.org
895 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
22 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
122 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 google.com
adservice.google.com
apis.google.com
19 KB
2 google.de
adservice.google.de
349 B
2 facebook.com
www.facebook.com
480 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
530 B
1 criteo.net
static.criteo.net
14 KB
1 ibillboard.com
video-adserver.ibillboard.com Failed
bbcdn-bbnaut.ibillboard.com
1014 B
1 rfihub.com
p.rfihub.com
707 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 B
1 contextweb.com
bh.contextweb.com
688 B
1 powerlinks.com
px.powerlinks.com
402 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
1 pubmatic.com
hbopenbid.pubmatic.com Failed
ads.pubmatic.com
1 yieldlab.net
ad.yieldlab.net
753 B
1 adform.net
adx.adform.net Failed
track.adform.net
448 B
1 giga-video.de
files.giga-video.de
30 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
449 B
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
598 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
91 KB
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 criteo.com Failed
bidder.criteo.com Failed
0 otto.de Failed
orbidder.otto.de Failed
0 adtech.de Failed
adserver.adtech.de Failed
0 smartadserver.com Failed
prg.smartadserver.com Failed
255 64
Domain Requested by
18 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
www.googletagservices.com
15 www.giga.de www.giga.de
14 trc.taboola.com 6 redirects cdn.taboola.com
www.giga.de
14 www.google-analytics.com www.giga.de
www.google-analytics.com
9 match.taboola.com www.giga.de
vidstat.taboola.com
8 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
7 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
7 media.oadts.com www.giga.de
media.oadts.com
7 sb.scorecardresearch.com 3 redirects cdn.taboola.com
www.giga.de
7 lb14.s400.meetrics.net www.giga.de
7 static.giga.de www.giga.de
6 t.teads.tv www.giga.de
6 tpc.googlesyndication.com securepubads.g.doubleclick.net
6 cdn.taboola.com www.giga.de
cdn.taboola.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 tracking.m6r.eu 2 redirects www.giga.de
cdn.m6r.eu
4 a.teads.tv www.giga.de
a.teads.tv
4 go.giga-abs.de www.giga.de
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
4 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
3 convammp.taboola.com
3 x.bidswitch.net 3 redirects
3 ib.adnxs.com 2 redirects cdn-a.yieldlove.com
3 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 ih.adscale.de www.giga.de
js.adscale.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 de.ioam.de 2 redirects www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 uss.xplosion.de www.giga.de
2 intake.prod.pubstack.io www.giga.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 cmp.teads.mgr.consensu.org a.teads.tv
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 ssl.2.damoh.giga.de text
2 match.adsrvr.org 2 redirects
2 sync.mathtag.com 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 t.nativendo.de c.nativendo.de
2 js.adscale.de c.nativendo.de
js.stroeermediabrands.de
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
2 d.nativendo.de www.giga.de
c.nativendo.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 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.prod.pubstack.io boot.pubstack.io
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 sync.teads.tv a.teads.tv
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 acdn.adnxs.com cdn-a.yieldlove.com
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 tracking.yieldlove-ad-serving.net cdn-a.yieldlove.com
1 ssl.1.damoh.giga.de text
1 static.criteo.net cdn-a.yieldlove.com
1 imprammp.taboola.com www.giga.de
1 p.rfihub.com 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 bh.contextweb.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com 1 redirects
1 15.taboola.com cdn.taboola.com
1 native.adscale.de c.nativendo.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 ad.yieldlab.net cdn-a.yieldlove.com
1 files.giga-video.de www.giga.de
1 d.agkn.com js.agkn.com
1 cdn.m6r.eu js.stroeermediabrands.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 ajax.googleapis.com www.giga.de
1 apis.google.com www.giga.de
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.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 crops.giga.de www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
0 video-adserver.ibillboard.com Failed media.oadts.com
0 hbopenbid.pubmatic.com Failed cdn-a.yieldlove.com
0 bidder.criteo.com Failed cdn-a.yieldlove.com
0 orbidder.otto.de Failed cdn-a.yieldlove.com
0 adserver.adtech.de Failed cdn-a.yieldlove.com
0 prg.smartadserver.com Failed cdn-a.yieldlove.com
0 adx.adform.net Failed cdn-a.yieldlove.com
255 106
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-10-31 -
2020-09-10
10 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-10-10 -
2020-01-02
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
2019-09-22 -
2019-12-20
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.google.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
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
2018-09-27 -
2019-11-26
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-10-14 -
2020-04-21
6 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.apis.google.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-10
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months 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
2019-10-16 -
2020-01-14
3 months crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-03-26 -
2020-03-30
a year crt.sh
tracking.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-31 -
2019-11-29
3 months crt.sh
yieldlove-ad-serving.net
Amazon
2019-10-23 -
2020-11-23
a year crt.sh
*.pubmatic.com
DigiCert SHA2 Secure Server CA
2018-12-13 -
2020-03-13
a year crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh
teads.tv
Let's Encrypt Authority X3
2019-10-30 -
2020-01-28
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
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
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
cdn.prod.pubstack.io
Let's Encrypt Authority X3
2019-09-19 -
2019-12-18
3 months crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 30 frames:

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

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: CA017DBB6EF68AEBB36B89CDC64C54C1
Requests: 18 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191028/r20190131/zrt_lookup.html
Frame ID: 2EDB46D02B7DFB9C471BC9639B4AD5C3
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: B558BB7054BE817D43E7497658AF442D
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=1301661270&w=468&lmt=1572599976&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1572599976248&bpp=16&bdt=223&fdt=115&idt=115&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&correlator=7574027762014&frm=20&pv=2&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=8799325258750&dssz=53&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=446&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=2071332787094561&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=psueKwmRxY&p=https%3A//www.giga.de&dtd=127
Frame ID: 39844A7F38821FA3E68A2183F19C0D94
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=1572599976&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1572599976302&bpp=5&bdt=277&fdt=84&idt=85&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574027762014&frm=20&pv=1&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=571749278680062&dssz=54&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=2071332787094561&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=88
Frame ID: 22472F8B49AB1DE82BEE65DD7AAB8F6E
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=754161734&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 29DE4AB7B5A6AE9D38C2E8B4013A7430
Requests: 1 HTTP requests in this frame

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

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsto8hPtCdaMhU_JnqO93iRswVgb-_ZwSTiddotUTKrhg6i1kDG4Ptik4amB_FYZyXE4MgkSLiLOcDHdAmErp497bPnI6uMqex1sw280RSeXwzR1dtFZjvnKtw7tF_ThTuZh2kjXZQESbIrRIK3rX3NFK0mBTNN3PlvPhIwBtoRmt6mNTCiQkffhsdbbhhLPpcOHXGVqbAzMJ0zIiwPLsByusqoH7Jju_HMh4-t_e3LVgbXmCK0KcObSGQ1ePYS82jKBGsmtYKhRwFM-ovppG7AHww&sig=Cg0ArKJSzPdhSygrIntrEAE&urlfix=1&adurl=
Frame ID: 2EBB3840E03FCB5527D61BCA7E99F855
Requests: 11 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1
Frame ID: CB75FB478427C17C3D38F324D5EC78AA
Requests: 1 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d151e11f-3218-4d56-b244-24860f5c095e
Frame ID: EBEDDA1BCE404F34F04BE71CC9EF349E
Requests: 13 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst-pZ7TWoWtHKD1h5JHfXH0m_V33Bcl8fdq0Azwh8CNVXdukyFMF8UVRO9uSJY0-s-jKS2PEcCX-mbdDEhq8hmwu6BOUtRTskjO_6vZyEL1iTcc-oUo8HfEbnlozA2Y6Zu4MwQWsRpfLlhTKFop_q3kVbT6Y7TVRzWWKgs9ZGLVvS3ho42KntL_Z5xZNEVSINQsfAwo2M505kGBhz9qAIEZ2AeOBN6qcOsP4hKDj352Yvsqu9Ow_ZTKy_1eQluxg8iDnPbcw4T0RvaQ6QSo&sig=Cg0ArKJSzGpx2Hr0sYGIEAE&urlfix=1&adurl=
Frame ID: 64C1868C9407EC54FA327D25E2466378
Requests: 10 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv_d__p8oW-PXQgBaeg046bs9MtAY43LT90vFUUbxU31D6KzscxT2iXaHAV8GsNmMotSo7pY-Dn2OjPCTdQb2NObPRKzxzuYROShqggGMGNf7TJv4WEU1CZCuJ_794_6ODpFHetJ71BG5VPZC3LQsdUn5Sfe2kAF3pW4jnAVzAN12pq3L0xw-ud9QrFXAhYBvmzSTGS23YpzKxUTD3Ap8eJYKMQJPzb7XXcTq24D9AeBcrlYIo2AnrPO8fm9S1THvY8rOCzzrt09tt82SFcAA&sig=Cg0ArKJSzHZ0h6enySEfEAE&urlfix=1&adurl=
Frame ID: 10076CBA38212777831A09544FFC8169
Requests: 11 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=B137B33E781077083601186798433&cicmp=1657475&cijs=1&dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&tst=1&docw=0&cs=false
Frame ID: AAA3A95AB7046BDCD0CBB871D59A2575
Requests: 1 HTTP requests in this frame

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

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

Frame: https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Frame ID: 8134524CBD5894F080E5269D828D4985
Requests: 1 HTTP requests in this frame

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

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: 7691590992154ABFA75A4CAB0B443928
Requests: 1 HTTP requests in this frame

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: 99BC0039C4D5A52858AD84AED5AC09BD
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 51BF6D23FA7515C567014E0ED1D89DA5
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: 19482D865221D7631E3FDF0F55C2C2F6
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: 453793195116FF77B19E03324F25CDFE
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Frame ID: C7745FAA80443C7632BEB7906BA15A08
Requests: 1 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=76332&userId=b0e6cb8f-7059-4227-8ffd-1040d2215c8e&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1572599986860
Frame ID: 431E2DCE7A8CA2AD808FCEF0721B8711
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4208315352051784580
Frame ID: 9671B36FBE9CC6A752F83BBBAA88C057
Requests: 1 HTTP requests in this frame

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

Frame: https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Frame ID: 4B4C0047AC5A94E306ED79C6C7ED13D0
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Frame ID: 997089A7116CC24E9DAD75BB5A120957
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

255
Requests

94 %
HTTPS

21 %
IPv6

64
Domains

106
Subdomains

72
IPs

9
Countries

2843 kB
Transfer

8653 kB
Size

13
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 18
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 25
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=0018&i2=001884460d9fc2cda5dbbf8a8&ep=1594497628&vr=415&id=wapd74&i3=001884460d9fc2cda5dbbf8a8%3A1603531176207%3A1572599976207%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1572599976207&n1=2&dntt=0&lt=1572599976208&ev=&cs=sa224h&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=0018&i2=001884460d9fc2cda5dbbf8a8&ep=1594497628&vr=415&id=wapd74&i3=001884460d9fc2cda5dbbf8a8%3A1603531176207%3A1572599976207%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1572599976207&n1=2&dntt=0&lt=1572599976208&ev=&cs=sa224h&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 34
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 38
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 39
  • 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/0fe65b8f-cd7a-4986-9883-bcaad8c146f3/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 94
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 115
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Request Chain 118
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuWS4TRk-EKEcLpW7XbWOdFkt4S7JjIBcVN0r5gjpME1sSqdCLPj-hndIiwCM9hSs_0_WcV8SQ9pwjFuQJNoEGbN83oncLodFapXRRklIVaaa94vlsCF0KdpcjnTn2wkPBlvIL1TZnx_kdt8g62PJ-VYfiqha--V2bUm7LEkPLOIplERQkuQvzrRpnF-q8zOsiK4QVlh2c-Zz2xcKjQEELQlYHuRDzDZt7Lyt7yXQ8AMa-jYXhkeARyiP84iw0PUTmp1h0x0Ta_RFd0qFKE1w&sig=Cg0ArKJSzDtIAXCbY8vdEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 137
  • 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=d151e11f-3218-4d56-b244-24860f5c095e
Request Chain 138
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698 HTTP 302
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Request Chain 139
  • 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=cWma_hAZiVKvuCXv-OhoH49PtD9Sj1g4DK1xhqdnP5s%3D
Request Chain 140
  • 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=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1 HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1 HTTP 302
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Decaa5dbb-f479-4c00-a34b-7c906c6d46c1
Request Chain 141
  • 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%% HTTP 302
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=cO4hTollQPHZ&ev=1&pid=562107
Request Chain 142
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990 HTTP 302
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5233567564189119990&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D5233567564189119990
Request Chain 143
  • 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=CAESENsuWI9FftzYffg6_BoVTFI&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENsuWI9FftzYffg6_BoVTFI&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3DCAESENsuWI9FftzYffg6_BoVTFI%26google_cver%3D1
Request Chain 144
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990
Request Chain 145
  • 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=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D691b0b3e-dd26-48f3-ba89-fd6ddeb6c780
Request Chain 146
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Ddabdd010-2a79-4faf-8dcd-4b30a6495b62
Request Chain 149
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1871316018019192582&expires=30&ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3De6ddce6b-41f2-4c60-93dc-da1301aab082
Request Chain 214
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=96537052&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=96537052&cs_ucfr=1
Request Chain 217
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=49068366&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=49068366&cs_ucfr=1
Request Chain 252
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBDaZESbZBi7CWiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4208315352051784580

255 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/
142 KB
52 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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
6d904d6bbc4b820ab764c1b3c90295f2d983600fbba64417a365273edc7d218d

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/78.0.3904.70 Safari/537.36
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Fri, 01 Nov 2019 09:19:35 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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

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

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
last-modified
Thu, 31 Oct 2019 11:00:00 GMT
server
nginx
accept-language
bytes
etag
"5dbabeb0-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
Sat, 31 Oct 2020 09:19:36 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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

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

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
last-modified
Thu, 31 Oct 2019 11:00:00 GMT
server
nginx
accept-language
bytes
etag
"5dbabeb0-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
Sat, 31 Oct 2020 09:19:36 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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

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

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
last-modified
Thu, 31 Oct 2019 11:00:00 GMT
server
nginx
accept-language
bytes
etag
"5dbabeb0-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
Sat, 31 Oct 2020 09:19:36 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 - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
561
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19136-FRA
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 09:10:14 GMT
server
Apache
x-timer
S1572599976.181466,VS0,VE0
date
Fri, 01 Nov 2019 09:19:36 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Sat, 02 Nov 2019 09:10:14 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
89
pre-230ee83dd6.js
www.giga.de/static-local/dist/assets/js/
59 KB
19 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-230ee83dd6.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
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d2551f438aa7ac58a6a6874b7aff532a8c48263f9aeec594205c1000e7eea1b9

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 31 Oct 2019 08:46:46 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5dba9f28-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19334
expires
Fri, 30 Oct 2020 08:46:46 GMT
main-desktop-4526bbca79.css
www.giga.de/static-local/dist/assets/css/
365 KB
51 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-4526bbca79.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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
986a1a73fffb8cebf044d02d414d3b6feaaf4aa859a9536def1fd7d2dfc65f8f

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 31 Oct 2019 08:46:46 GMT
content-encoding
gzip
x-original-content-length
373718
server
nginx
status
200
etag
W/"5dba9f26-5b3d6"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
51558
expires
Fri, 30 Oct 2020 08:46:46 GMT
iam.js
script.ioam.de/
34 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.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0018
Resource Hash
ecd7c13e05f36fd7c2c71d595b309fa90cb716db9f546e24f013a00a83e99def

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Content-Encoding
gzip
Last-Modified
Fri, 01 Nov 2019 09:19:36 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0018
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
Fri, 01 Nov 2019 11:19:36 GMT
metaTag.min.49ff1247b7f696cb6036ee41ad1ec747.js
js.stroeermediabrands.de/
248 KB
60 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.49ff1247b7f696cb6036ee41ad1ec747.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
cad43bad6bf9e313533b21a022ac72929bbd656026809564e644f3fa7f70c33e

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Wed, 30 Oct 2019 10:51:54 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
Sat, 31 Oct 2020 09:19:36 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
b5f0280127c5bea6981151d26ce4b58e1ef4d889f6130c9f6a3cd05577706db1

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Content-Encoding
gzip
Last-Modified
Thu, 31 Oct 2019 08:12:44 GMT
ETag
"5dba977c-6f81"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Sat, 02 Nov 2019 09:19:36 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

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 19 Oct 2019 14:38:48 GMT
x-content-type-options
nosniff
age
1104048
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Sat, 19 Oct 2019 14:38:48 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
Mon, 18 Nov 2019 14:38:48 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
103 KB
36 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 - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
4569e7429d33daa2505363cd450e5dea11dcece3db7cf0a9074a3e47ce0dc082
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-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
37140
x-xss-protection
0
server
cafe
etag
15295741376476878068
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 01 Nov 2019 09:19:36 GMT
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
18 KB
19 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 07:27:59 GMT
x-content-type-options
nosniff
age
2253097
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Sat, 07 Sep 2019 12:36:06 GMT
server
nginx/1.10.3
filer-attr
W1s4OTAsNDg1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 07 Oct 2019 12:36:06 GMT
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
16 KB
17 KB
Image
General
Full URL
https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 25 Oct 2019 05:50:15 GMT
x-content-type-options
nosniff
age
617361
filer-source
833cb36a650161e736193aec5c3891398d2fa56a03e872ecb4014e0c343af106
x-cache
HIT
status
200
accept-language
bytes
content-length
16480
x-xss-protection
1; mode=block
last-modified
Fri, 25 Oct 2019 05:50:15 GMT
server
nginx/1.10.3
filer-attr
W1s2MjUsMjEwXSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 24 Nov 2019 05:50:15 GMT
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
21 KB
21 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 12 Oct 2019 08:19:18 GMT
x-content-type-options
nosniff
age
1731617
filer-source
7154c03f1279d42875baf477c69c8abd717043148b5dba0c147151812277507b
x-cache
HIT
status
200
accept-language
bytes
content-length
21316
x-xss-protection
1; mode=block
last-modified
Sat, 12 Oct 2019 08:19:18 GMT
server
nginx/1.10.3
filer-attr
W1s0MTUsNTczXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 11 Nov 2019 08:19:18 GMT
darkmode-gmail-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/09/
3 KB
4 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/09/darkmode-gmail-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
503846ab82d6e87e84e9beb96dd673802554cdf89c381b7c2ad533c91b4702a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 28 Oct 2019 16:18:49 GMT
x-content-type-options
nosniff
age
320447
filer-source
f6a31838460e8adb57bf8822c25ea67e3b3dee930390cd283eda97ba2b5e3fb7
x-cache
HIT
status
200
accept-language
bytes
content-length
3150
x-xss-protection
1; mode=block
last-modified
Mon, 28 Oct 2019 16:18:49 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 27 Nov 2019 16:18:49 GMT
microsoft-office-rcm200x113.jpg
static.giga.de/wp-content/uploads/2018/04/
7 KB
8 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2018/04/microsoft-office-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
97330a2d17528e86e02483b488a9625984e4670db18c0b4bf2e216a9432e3c3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 27 Oct 2019 04:57:44 GMT
x-content-type-options
nosniff
age
447711
filer-source
6ad81aabe131ebc1baba52d8e6603e39b3dc82f96ebd04b76eb6f2056022ac18
x-cache
HIT
status
200
accept-language
bytes
content-length
7433
x-xss-protection
1; mode=block
last-modified
Thu, 24 Oct 2019 02:15:03 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 23 Nov 2019 02:15:03 GMT
aax-to-mp3-umwandeln-rcm200x113.jpg
static.giga.de/wp-content/uploads/2014/12/
6 KB
7 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2014/12/aax-to-mp3-umwandeln-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
20ce00165354bc40041f0dd75824170fd3d0baf803a98defcd3fde1774a320d6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 25 Oct 2019 13:12:45 GMT
x-content-type-options
nosniff
age
590811
filer-source
c30156018bb35e4af0898eccf656308cafd8883b4007861b104b12440db619ad
x-cache
HIT
status
200
accept-language
bytes
content-length
6181
x-xss-protection
1; mode=block
last-modified
Fri, 25 Oct 2019 13:12:45 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 24 Nov 2019 13:12:45 GMT
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 22 Oct 2019 06:30:57 GMT
x-content-type-options
nosniff
age
874119
filer-source
8fa6d82067b578ca8e6bb273bed34f9d123e3ee778a1db1a4f9ea350b5447154
x-cache
HIT
status
200
accept-language
bytes
content-length
5657
x-xss-protection
1; mode=block
last-modified
Wed, 09 Oct 2019 04:44:57 GMT
server
nginx/1.10.3
filer-attr
W1syMzUsMTI5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 08 Nov 2019 04:44:57 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
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 - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.19 /
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/78.0.3904.70 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Fri, 01 Nov 2019 09:19:36 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Last-Modified
Fri, 01 Nov 2019 09:19:36 GMT
Server
s2.50.19
Access-Control-Allow-Origin
*
Transfer-Encoding
chunked
Content-Type
text/html
Location
/blank.gif
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
217 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:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-23=":443"; ma=3600
content-length
44
expires
Fri, 01 Nov 2019 09:19:36 GMT
tr
www.facebook.com/
44 B
263 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
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:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-23=":443"; ma=3600
content-length
44
expires
Fri, 01 Nov 2019 09:19:36 GMT
analytics.js
www.google-analytics.com/
43 KB
17 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-230ee83dd6.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
5112
date
Fri, 01 Nov 2019 07:54:24 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Fri, 01 Nov 2019 09:54:24 GMT
apstag.js
c.amazon-adsystem.com/aax2/
77 KB
22 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-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
3eff4b19f68ce57e174c9bc4a9ad7ff56204249cab27cb9a18cb2bb68723b217

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 04:55:23 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-C1
etag
149fe04db65d236d0abc505cd6c6594a
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
accept-ranges
bytes
x-amz-cf-id
3r3Wg27NwcYgpof-GZ_Oq-oB5gnH89VpNJkZGE8Utg7HBxZcj0woAQ==
via
1.1 1ac3fd533bf6be1b511077f8b8e23bfd.cloudfront.net (CloudFront)
init
d.nativendo.de/cds/delivery/
991 B
918 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 - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Fri, 01 Nov 2019 09:19:36 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
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 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.3432659265716669
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

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=0018&i2=001884460d9fc2cda5...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=0018&i2=001884460d9fc2cda5dbbf...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.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
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx /
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
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
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Sat, 02 Nov 2019 09:19:36 GMT

Redirect headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0021
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
Fri, 01 Nov 2019 09:19:36 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
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
Thu, 01 Nov 2018 09:19:36 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
9 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?62585758
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5

Request headers

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

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
last-modified
Thu, 31 Oct 2019 11:00:00 GMT
server
nginx
accept-language
bytes
etag
"5dbabeb0-25d8"
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
9688
expires
Sat, 31 Oct 2020 09:19:36 GMT
176875
videos.giga.de/embed/ Frame CA01
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875?autoplay=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
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
8e851426fdd64dbee15e3f999b9b528b45c1ada813496ec03c62f279aaf426c9

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875?autoplay=0
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=001884460d9fc2cda5dbbf8a8:1603531176207:1572599976207:.giga.de:2:giga:software_content:noevent:1572599976207:lefm7l
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Fri, 01 Nov 2019 09:19:36 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/176875>; rel="canonical"
content-encoding
gzip
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.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.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-4526bbca79.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 23:22:31 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Thu, 26 Mar 2020 23:22:31 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:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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.js
pagead2.googlesyndication.com/pagead/js/r20191028/r20190131/
241 KB
89 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191028/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5897fcecbdc03845bde1aa80fc89667ee8e842b538da9018e69596143b0ec246
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-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
90530
x-xss-protection
0
server
cafe
etag
15856280178048818908
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 01 Nov 2019 09:19:36 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191028/r20190131/ Frame 2EDB
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191028/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:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20191028/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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Thu, 31 Oct 2019 18:25:12 GMT
expires
Thu, 14 Nov 2019 18:25:12 GMT
content-type
text/html; charset=UTF-8
etag
8648543205226238674
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7402
x-xss-protection
0
cache-control
public, max-age=1209600
age
53664
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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.45281691135210855
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
01eaaddbf33783ef044e24841a754507c9574b2d05c132194f90a0d3bf79d90e
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
X-Content-Type-Options
nosniff
Last-Modified
Fri, 01 Nov 2019 09:19:36 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Sat, 02 Nov 2019 09:19:28 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame B558
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
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.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Fri, 01 Nov 2019 09:19:36 GMT
Content-Length
1578
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=fffc460d8e87922cc9ae8352be09f974; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Thu, 30 Jan 2020 09:19:36 GMT

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
Fri, 01 Nov 2019 09:19:36 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Fri, 01 Nov 2019 10:19:36 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
47 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
40453ae86a1fe7ab4249e3cd04be5eb62ac5b2f55edf415beb234f0b6acab8be
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"323 / 28 of 1000 / last-modified: 1572538918"
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14900
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
296 KB
91 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.95.203 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-95-203.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
6f10b03685724bdfc52c8978adc09b6a4152b8abb18a141faffeeb6772144102

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 07:51:27 GMT
content-encoding
gzip
x-amz-cf-pop
FRA2
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-id
gLsm1eYe0aiB2l7pzyxeqnFzW6jbQFldmU7-AuLG9WO5Q1zmUJ4zLw==
via
1.1 c1b77f069e81fd54b56ee92a790a3e9b.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 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
49094
Expires
Fri, 01 Nov 2019 11:19:36 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
598 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.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
7d4490a269fa0d8511cfa0e1511a80da079e2dd535ca1b882b1687fc734aa03a

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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 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
107

Redirect headers

Date
Fri, 01 Nov 2019 09:19:36 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/0fe65b8f-cd7a-4986-9883-bcaad8c146f3/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/0fe65b8f-cd7a-4986-9883-bcaad8c146f3/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/0fe65b8f-cd7a-4986-9883-bcaad8c146f3/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:ce00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
ff173dd4735ac42b87fef47ff6ce919d98fb4526968bcab620da44c9e952fa21

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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
via
1.1 b83a899c16a2f53127e152fe5fc783a4.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
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
1800
x-amz-cf-id
-NZi2J2aOOTuNoGrKeyYAuvRkNUeDAq6_zJLVLOH6RZak_ZsJ5coXg==

Redirect headers

date
Fri, 01 Nov 2019 09:19:36 GMT
via
1.1 632ee301c4920b52f2463aa9e978c57f.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/0fe65b8f-cd7a-4986-9883-bcaad8c146f3/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
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
KcTMcJYh-JQA11Ajg1YxGlkFdApmY-Cz3Yz0FF8OBHsJwLmV7_i-EA==
ad-loading.gif
www.dunkirkinception.com/detect/
138 B
449 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagex/
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
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
00121dd824abb5a00e96339988e86d79348fbef3619e7035842529f608a945a3

Request headers

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

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
X-Powered-By
TSAdServer
ETag
W/"8a-Ufvz453GwQPSQwiGMSHO6hcOoiY"
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
138
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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:2e00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 22 Oct 2019 20:23:19 GMT
via
1.1 5d8c59c4e33ff30f6610982ac8ad0232.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
46576
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
_VvkUp48Bco-0IDAbDJ0QhnHV5dMms-Q-j5m3bP6GKXQnrZDsjyYzQ==
post-0d7e020278.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-0d7e020278.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6a35a30c444e5d9611c4f9e8da25bfb2303279f93f1810a6b18370dc5f83c1e

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 28 Oct 2019 16:48:57 GMT
content-encoding
gzip
x-original-content-length
7069
server
nginx
status
200
etag
W/"5db71bab-1b9d"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2690
expires
Tue, 27 Oct 2020 16:48:57 GMT
giga-e4340d5047.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-e4340d5047.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c2b3d37bbd5d7c33152f415cd86a5f21fafe59998fa9664445017bb56213285c

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 14 Oct 2019 12:00:53 GMT
content-encoding
gzip
x-original-content-length
31423
server
nginx
status
200
etag
W/"5da46323-7abf"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11774
expires
Tue, 13 Oct 2020 12:00:53 GMT
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/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:34 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:34 GMT
js
www.google-analytics.com/gtm/
57 KB
21 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=776271333.1572599976&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
07c1ac6e6ae438844b3048f93e59991b35a8d646f80f7be0619b939293b9904d
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
br
last-modified
Fri, 01 Nov 2019 09:00:00 GMT
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
21582
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 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/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 23:22:29 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 23:22:28 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 3984
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=1301661270&w=468&lmt=1572599976&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1572599976248&bpp=16&bdt=223&fdt=115&idt=115&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&correlator=7574027762014&frm=20&pv=2&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=8799325258750&dssz=53&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=446&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=2071332787094561&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=psueKwmRxY&p=https%3A//www.giga.de&dtd=127
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191028/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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=1301661270&w=468&lmt=1572599976&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1572599976248&bpp=16&bdt=223&fdt=115&idt=115&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&correlator=7574027762014&frm=20&pv=2&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=8799325258750&dssz=53&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=446&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=2071332787094561&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=psueKwmRxY&p=https%3A//www.giga.de&dtd=127
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Fri, 01 Nov 2019 09:19:36 GMT
server
cafe
content-length
21285
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 01-Nov-2019 09:34:36 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
Fri, 01 Nov 2019 09:19:36 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
78 KB
29 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/r20191028/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c0b74996deebf9409b61191121b6d7a8156ba2cfb1db0b3baa429d0d73f1d3b8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29301
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 2247
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1572599976&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1572599976302&bpp=5&bdt=277&fdt=84&idt=85&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574027762014&frm=20&pv=1&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=571749278680062&dssz=54&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=2071332787094561&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=88
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191028/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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=1572599976&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1572599976302&bpp=5&bdt=277&fdt=84&idt=85&shv=r20191028&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574027762014&frm=20&pv=1&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&ga_fc=0&iag=0&icsg=571749278680062&dssz=54&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=2071332787094561&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=88
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Fri, 01 Nov 2019 09:19:36 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 01-Nov-2019 09:34:36 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
Fri, 01 Nov 2019 09:19:36 GMT
cache-control
private
loader.js
c.nativendo.de/cdn/asset/js/
54 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
via
1.1 google
cf-cache-status
HIT
age
261570
cf-polished
origSize=55238
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
52ecc9bcbcdb5994-VIE
expires
Sat, 31 Oct 2020 09:19:36 GMT
videojs-ff0ddd6c.min.js
videos.giga.de/dist/js/embed/bundle/ Frame CA01
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
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
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-9a933"
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 CA01
272 KB
92 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?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c5ce02d4faa9333de3e11f24c4cb2f335edb64ff6c0e9174365e8a34c550e75b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
94526
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 GMT
bid
c.amazon-adsystem.com/e/dtb/
98 B
486 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=Z7Fi4XsQn944E&cb=0&ws=1600x1200&v=7.41.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-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
113
via
1.1 1ac3fd533bf6be1b511077f8b8e23bfd.cloudfront.net (CloudFront)
x-amz-cf-id
HekgNJewF5pJCN9X_eOdUYF63TT7K3OEZS819tLmKhR0op-pbvI2AQ==
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
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 24 Oct 2019 21:35:48 GMT
content-encoding
gzip
vary
Accept-Encoding,Origin
age
42216
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Sat, 19 Oct 2019 18:03:24 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 96ab38d99b79d57e5c7e9b8a07c0fad3.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
TwU3xUKF6Vb9hh5PxKBLCd6rrAq_JYaNyjRpvlYBCrN3pM-0FGcujQ==
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/static-local/dist/assets/js/pre-230ee83dd6.js
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
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Dec 2018 15:40:09 GMT
Server
nginx
ETag
W/"5c0fda59-74548"
Transfer-Encoding
chunked
Content-Type
application/javascript
platform.js
apis.google.com/js/
48 KB
19 KB
Script
General
Full URL
https://apis.google.com/js/platform.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
ESF /
Resource Hash
3752aa6373c6cffb52d27da513bdd2f0b543bbe61b3ae7d56fd0c27c74367fd2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-8/rBcanOIgSQFZNxKGT+eA' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /_/cspreport
p3p
CP="This is not a P3P policy! See g.co/p3phelp for more info."
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
x-xss-protection
0
x-ua-compatible
IE=edge, chrome=1
server
ESF
x-frame-options
SAMEORIGIN
etag
"81efe93b9bed00d1a4c29abf7e8b0375"
strict-transport-security
max-age=31536000
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=1800, stale-while-revalidate=1800
timing-allow-origin
*
expires
Fri, 01 Nov 2019 09:19:36 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
113 KB
22 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-0d7e020278.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
b602e8ce0a5d8e6d4798ff4de14f4ec304e079692386853ac1e7e2e3ad5c29d0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
vw61IkYTjVoAveqNsijiIpYMppqH0yIz
content-encoding
gzip
etag
"9451b74d2606697da1cbdb3bfd3409e8"
age
44
x-cache
HIT
status
200
content-length
22087
x-amz-id-2
bzyuocOy5AB4m+2ik/UPczKByvTVOX7rnQqpyaWALC1OBXcJ8a8KEy5YKT0qMclx9lwO43aH/lo=
x-served-by
cache-fra19173-FRA
last-modified
Thu, 31 Oct 2019 19:05:56 GMT
server
AmazonS3
x-timer
S1572599977.504328,VS0,VE0
date
Fri, 01 Nov 2019 09:19:36 GMT
vary
Accept-Encoding
x-amz-request-id
BBBCE10A85B22EEC
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
21
x-cache-hits
7
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame CA01
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?autoplay=0
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

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-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 CA01
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?autoplay=0
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

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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
Thu, 30 Jan 2020 09:19:36 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/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 31 Oct 2019 03:30:10 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
107366
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
Fri, 30 Oct 2020 03:30:10 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=j79&aip=1&a=416249672&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=917772293&gjid=237881864&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=67765596
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:36 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=1767266378
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
101 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=1743319271
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=1874483933
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=2093422082
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=225849962
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1016311603
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=1886930132
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=2086766368
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 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/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:09 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:09 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=801660092
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
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/static-local/dist/assets/js/pre-230ee83dd6.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
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=1572599976491&__it=-60&__ic=727391&__iq=83df30ad54b53dcc566da371aa312ad5&__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

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 GMT
Last-Modified
Sat, 24 Oct 2009 09:18:56 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
Fri, 26 Oct 2012 09:18:56 GMT
pubads_impl_2019102401.js
securepubads.g.doubleclick.net/gpt/
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
b40c3274538f0155c83d1a9e4d3a68d94d61425a71cddee3ffd7d38a99465733
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58552
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 GMT
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1175
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
via
1.1 google
cf-cache-status
HIT
age
261569
cf-polished
origSize=5959
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
52ecc9bd4d195994-VIE
expires
Sat, 31 Oct 2020 09:19:36 GMT
submit
lb14.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb14.s400.meetrics.net/bb-mx/submit?/dm9OBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSvSBPAAAAAAAAAOAAAAGBAAAAAAZwSvSBBRksFAQtjFRCm9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 01 Nov 2019 09:19:35 GMT
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9OCHAAATkzFARksFAQtjFWqJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:35 GMT
impl.20191029-10-RELEASE.js
cdn.taboola.com/libtrc/
394 KB
112 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20191029-10-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9d9d83e218b77ec50f10293adbdff01bd7e83d3cd2bf70e2aa8507e10c13c670

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
3bE.NpG8z8zEJle322Fdy.59xyIrlFpD
content-encoding
gzip
etag
"75d01218be23267ee0720ca0b0cdec27"
age
106
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
114004
x-amz-id-2
6EsifWn1VUqjLDk8btA3ozVj3sADr7rBN/6ho2B4VnoPgCEQOC56Fsaog6w0bfI67bAYz8uF00U=
x-served-by
cache-fra19173-FRA
last-modified
Wed, 30 Oct 2019 14:08:47 GMT
server
AmazonS3
x-timer
S1572599977.565708,VS0,VE0
date
Fri, 01 Nov 2019 09:19:36 GMT
vary
Accept-Encoding
x-amz-request-id
D9A5CC75E050A541
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
4
x-cache-hits
569
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
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 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
901
Expires
Sat, 02 Nov 2019 09:19:36 GMT
adblock-relief.jsL-EJXE3.gif
www.giga.de/imagex/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagex/adblock-relief.jsL-EJXE3.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.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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, no-cache="set-cookie"
x-robots-tag
noindex, nofollow
content-length
71
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=1&d2=3&d4=2&d11=3&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
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Fri, 01 Nov 2019 09:19:36 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:36 GMT
Content-Encoding
gzip
Last-Modified
Mon, 28 Oct 2019 15:44:16 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Sat, 02 Nov 2019 09:19:36 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame 29DE
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=754161734&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.187.173 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-185-187-173.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Fri, 01 Nov 2019 09:19:36 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%3AGyEwHrIhrTghhoeQL7VFlUhFozghPiEV;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlTrUoJU61KAAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame CA01
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

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 13 Oct 2019 05:27:44 GMT
x-content-type-options
nosniff
age
1655512
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Wed, 09 Oct 2019 05:34:11 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
Fri, 08 Nov 2019 05:34:11 GMT
collect
www.google-analytics.com/
35 B
95 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=1340750414
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207690
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
d8f011a0-b7db-4b6a-8a50-5c1ef636ba3d
https://videos.giga.de/ Frame CA01
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/d8f011a0-b7db-4b6a-8a50-5c1ef636ba3d
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

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 CA01
53 B
642 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-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.52 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Last-Modified
Fri, 01 Nov 2019 08:07:53 GMT
Server
AmazonS3
x-amz-request-id
457EB7BE74BE1929
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
59Mxcye7AJIEwE1NfXYIX1929wougqNZ0WRrbrevYW7HnFArdw4i60s9H6QcfQA6bRkkMi6USm0=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame CA01
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-ff0ddd6c.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

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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
Fri, 01 Nov 2019 09:34:36 GMT
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
44 KB
11 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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
72a235e7f09698ff57f17d165b778a42515006c1181b0b438b20fefc53ad5684

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:39 GMT
Content-Encoding
gzip
Age
2769
X-Cache
HIT
Connection
keep-alive
Content-Length
11009
x-amz-id-2
GSoilyBF33AqKIfuyQBb6bO2qVy5kpGFy1FFZaqAvg2qlLH+51sLYrNSO8IuUe7MbfK72H70zrk=
X-Served-By
cache-hhn4021-HHN
Last-Modified
Fri, 01 Nov 2019 08:31:39 GMT
Server
AmazonS3
X-Timer
S1572599980.791719,VS0,VE0
ETag
"1ee7205b4cf988d3ab921ea410357316"
x-amz-request-id
CC2BF54D223AFCBE
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
11784
ads
securepubads.g.doubleclick.net/gampad/
11 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2071332787094561&correlator=3035715367798042&output=ldjh&impl=fif&adsid=NT&eid=21065018&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191101&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dfffc460d8e87922cc9ae8352be09f974%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn106-1%252Cn153-1%252Cn11-1%252Cn120-2%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-3%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-2%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-2%252Cn118-3%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn37-2%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-0%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1572599976&dt=1572599976750&dlt=1572599976025&idt=693&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2498078364&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=67&icsg=211827853888642&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
57c12efc57ffab5be80537ae2a27eebfdd1d4d0a4438a9323cb5dc576e6ace70
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4615
x-xss-protection
0
google-lineitem-id
5002100619
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265057624
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_2019102401.js
securepubads.g.doubleclick.net/gpt/
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019102401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
9c14e216c7aed649a11d2b47f8c6cf9f586ba7f426132ead03c4061b054ffcbd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24997
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:36 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

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=2071332787094561&correlator=3035715367798042&output=ldjh&impl=fif&adsid=NT&eid=21065018&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191101&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dfffc460d8e87922cc9ae8352be09f974%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn106-1%252Cn153-1%252Cn11-1%252Cn120-2%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-3%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-2%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-2%252Cn118-3%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn37-2%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-0%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1572599976&dt=1572599976759&dlt=1572599976025&idt=693&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=68&icsg=211827853888642&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
db94da7535bbb73e4216ca1faeb26fd270416b54697b49a98a6de2ee8a885d15
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 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-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
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame CF8C
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.218.7 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=Axe4iSMEzkXWqUDU9ipZvl4|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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Server
Date
Fri, 01 Nov 2019 09:19:37 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
181
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=Axe4iSMEzkXWqUDU9ipZvl4; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 09:19:36 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 09:19:37 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Fri, 01 Nov 2019 09:19:36 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=ox&dcc=t
Set-Cookie
ad-id=Axe4iSMEzkXWqUDU9ipZvl4|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 09:19:36 GMT; Path=/; HttpOnly
Vary
User-Agent
json
trc.taboola.com/stroeer-smb-giga/trc/3/
12 KB
5 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=10%3A19%3A36.800&lti=deflated&data=%7B%22id%22%3A545%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%3A1572599976792%2C%22cv%22%3A%2220191029-10-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A5185%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3738.296875%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
3f84e83f46fb67fd307519c00efa7fa757ae59f1e6bac3f21fcce9679f220285

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
485
date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
access-control-allow-origin
*
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
x-served-by
cache-fra19173-FRA
server
nginx
x-timer
S1572599977.817041,VS0,VE485
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame CA01
653 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-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Via
1.1 80c1ad5f9352d00b95a9da73eb6b6be5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
hci3IGQnmlp5fQ8LCUeqe-fUEQ756idB_DfwiOy9yRo7rEybcrx0Bg==
Expires
0
bid
c.amazon-adsystem.com/e/dtb/
98 B
484 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=Z7Fi4XsQn944E&cb=1&ws=1600x1200&v=7.41.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%2C%22301x601%22%5D%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
2e21f3ab5c18c0f77fad070b048fe8ae18b1ba56aaa381aa8e182bd2465a5677

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-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
112
via
1.1 1ac3fd533bf6be1b511077f8b8e23bfd.cloudfront.net (CloudFront)
x-amz-cf-id
Ev9LbVDkHwfSoQkKXdQIA_6YO56mzxHoe9l4yw28so0kGh3sWi6t2A==
/
adx.adform.net/adx/
0
0

v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572599976816;
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
0
0

ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572599976817;
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
0
0

ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572599976817;
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

9767198
ad.yieldlab.net/yp/
2 B
753 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/9767198?ts=1572599976818&json=true
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Thu, 31 Oct 2019 09:19:36 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
240 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=5743b503-16ca-47a5-842c-7f503f69a0f1&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.537303073180545
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, RSA, AES_128_GCM
Server
69.173.144.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
1020ce410f42d89ed67b5720a41fd195c062b0f143ba65b36eb58f11f0b664bc

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=354
Content-Length
240
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=0ee6e7ca-7a15-4d8e-b23a-285c074921b2&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.511520789219083
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, RSA, AES_128_GCM
Server
69.173.144.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
7b0df98ea63fbd2481814cf87dd68338fa58d5b663d67557b4a1608ed193fd8d

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=345
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=16530781-e58e-4f14-a2e8-2b5c9805420a&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.5619054458342978
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, RSA, AES_128_GCM
Server
69.173.144.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
0775e1310e014b794b768558720de1878d19dac609080bd1c50ea4744e2aeb1e

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=394
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
cdb
bidder.criteo.com/
0
0

translator
hbopenbid.pubmatic.com/
0
0

prebid
ib.adnxs.com/ut/v3/
1 KB
2 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
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_ECDSA, AES_128_GCM
Server
185.33.223.210 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
307.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
f68310371d726b752313d50c65838e131f22cd2e942e99a57afbedb63332a836
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Date
Fri, 01 Nov 2019 09:19:38 GMT
Content-Encoding
gzip
Transfer-Encoding
chunked
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"
Connection
keep-alive
X-Proxy-Origin
185.210.217.115; 185.210.217.115; 307.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.249:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
670689e0-c2f8-4366-818d-809df5c82a58
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 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=1572599976827&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:36 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
/
d.nativendo.de/cds/delivery/get/
5 KB
2 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=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
76b3b19a95332a901b3307edbb71056c6915cfc3268025209b2b78bf71f28adc

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:36 GMT
content-encoding
gzip
last-modified
Fri, 01 Nov 2019 09:19:36 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
1126
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
container
tracking.m6r.eu/pixel/
0
376 B
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n116=0&n104=1&n15=2&n155=1&n106=1&n153=1&n11=1&n120=2&n53=1&n154=1&n125=1&n8=1&n2=3&n137=0&n101=0&n108=0&n54=0&n110=0&n87=0&n149=1&n76=1&n66=1&n60=1&n139=1&n160=0&n107=0&n117=2&n86=0&n147=4&n64=0&n49=2&n119=3&n22=1&n18=1&n161=0&n126=1&n92=3&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=2&n141=0&n157=0&n99=0&n128=2&n118=3&n85=1&n9=3&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=4&n90=1&n37=2&n43=1&n55=1&n142=0&n7=1&n103=0&n158=1&n124=0&n75=1&n91=1&n114=1&n69=0&n10=3&n3=1&n82=0&n84=1&n5=3&n48=1&n109=1&n122=1&n67=0&n115=1&n89=1&n123=1&n17=1&n78=0&n44=1&n81=0&n88=0&n39=1&n156=1&n148=0
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
0
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame 9444
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuWS4TRk-EKEcLpW7XbWOdFkt4S7JjIBcVN0r5gjpME1sSqdCLPj-hndIiwCM9hSs_0_WcV8SQ9pwjFuQJNoEGbN83oncLodFapXRRklIVaaa94vlsCF0KdpcjnTn2wkPBlvIL1TZnx_...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
344 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.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:36 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=425487
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Wed, 06 Nov 2019 07:31:03 GMT

Redirect headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:36 GMT
x-content-type-options
nosniff
server
cafe
status
302
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"
access-control-allow-origin
*
cache-control
private
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",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
native
native.adscale.de/
157 B
603 B
XHR
General
Full URL
https://native.adscale.de/native
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
184.30.220.71 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
376ae7eda77ca5842e5d5b493a33b618e1fcd7400ec8b2dc934afd81ab580965

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2071332787094561&correlator=3035715367798042&output=ldjh&impl=fif&adsid=NT&eid=21065018%2C21064504&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191101&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dfffc460d8e87922cc9ae8352be09f974%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn106-1%252Cn153-1%252Cn11-1%252Cn120-2%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-3%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-2%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-2%252Cn118-3%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn37-2%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-0%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie=ID%3D96baffdc389daa01%3AT%3D1572599976%3AS%3DALNI_Ma3AQgSvLrtmnJgqV4b995J9DFQTg&cookie_enabled=1&bc=31&abxe=1&lmt=1572599976&dt=1572599976989&dlt=1572599976025&idt=693&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=71&icsg=3389245662218272&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECOBUjnIS12Z4&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
83f33dedecaa10ac5807665dafb0ef52c941415261db4f3bc1251611a20c3f4b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3127
x-xss-protection
0
google-lineitem-id
4766719661
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138260902657
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/
12 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2071332787094561&correlator=3035715367798042&output=ldjh&impl=fif&adsid=NT&eid=21065018%2C21064504&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191101&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dfffc460d8e87922cc9ae8352be09f974%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn106-1%252Cn153-1%252Cn11-1%252Cn120-2%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-3%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-2%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-2%252Cn118-3%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn37-2%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-0%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie=ID%3D96baffdc389daa01%3AT%3D1572599976%3AS%3DALNI_Ma3AQgSvLrtmnJgqV4b995J9DFQTg&cookie_enabled=1&bc=31&abxe=1&lmt=1572599976&dt=1572599976995&dlt=1572599976025&idt=693&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=71&icsg=3389245662218272&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECOBUjnIS12Z4&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
3fa35da37fea8894bd366c48afb08d025a79e74a918e828a7b349d03b1ff4867
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
content-encoding
br
x-content-type-options
nosniff
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
6968
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2071332787094561&correlator=3035715367798042&output=ldjh&impl=fif&adsid=NT&eid=21065018%2C21064504&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191101&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dfffc460d8e87922cc9ae8352be09f974%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn106-1%252Cn153-1%252Cn11-1%252Cn120-2%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-3%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-2%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-2%252Cn118-3%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn37-2%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-0%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie=ID%3D96baffdc389daa01%3AT%3D1572599976%3AS%3DALNI_Ma3AQgSvLrtmnJgqV4b995J9DFQTg&cookie_enabled=1&bc=31&abxe=1&lmt=1572599977&dt=1572599977000&dlt=1572599976025&idt=693&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=946476008&uci=5&ifi=6&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=71&icsg=3389245662218272&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECOBUjnIS12Z4&ga_vid=776271333.1572599976&ga_sid=1572599976&ga_hid=416249672&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
f191591317092c16ae5035a97e2458ab65148f5fb07511842baa5700429e03fd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3122
x-xss-protection
0
google-lineitem-id
4765983595
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138260901940
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
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
uCC6CzbG4eeBE1xtCmZfElydHe8jGhl9
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:04 GMT
Server
AmazonS3
x-amz-request-id
DA58C8E6E607B595
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 01 Nov 2019 09:19:37 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
B0ifqy7kTSRMisP8EQOLSQIlEgQOBuwlngT88E/RewsSP5wLKrSgyb4K1VeM7/4XxSFw9SyUpVU=
b9af30bd-3f20-4b2a-bd09-92adc652964f
t.nativendo.de/cds/tracking/event/
0
195 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/b9af30bd-3f20-4b2a-bd09-92adc652964f?aid=182yo&floor=YjlhZjMwYmQtM2YyMC00YmrVhx7FKQxYFQVP6g&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1572599977
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 google
last-modified
Fri, 01 Nov 2019 09:19:37 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
userconnect
ih.adscale.de/
95 B
364 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1572599977153&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
95
Expires
Fri, 01 Nov 2019 09:19:37 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame CA01
206 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=nOJyigZfam
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4377d3a42638a46178ac47f7f549cb5232f3a0c284f63b3023931fb83021225f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Wed, 30 Oct 2019 12:47:26 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 80c1ad5f9352d00b95a9da73eb6b6be5.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
znTDY5w10OgMC21WWPXVn2-wqei0KSiplBuew1frl58NQ-HONjNhWw==
view
securepubads.g.doubleclick.net/pcs/ Frame 2EBB
0
65 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsto8hPtCdaMhU_JnqO93iRswVgb-_ZwSTiddotUTKrhg6i1kDG4Ptik4amB_FYZyXE4MgkSLiLOcDHdAmErp497bPnI6uMqex1sw280RSeXwzR1dtFZjvnKtw7tF_ThTuZh2kjXZQESbIrRIK3rX3NFK0mBTNN3PlvPhIwBtoRmt6mNTCiQkffhsdbbhhLPpcOHXGVqbAzMJ0zIiwPLsByusqoH7Jju_HMh4-t_e3LVgbXmCK0KcObSGQ1ePYS82jKBGsmtYKhRwFM-ovppG7AHww&sig=Cg0ArKJSzPdhSygrIntrEAE&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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:37 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-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
video.php
media.oadts.com/www/delivery/ Frame 2EBB
108 KB
108 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Cache-Control
private, max-age=0, no-cache
Server
lighttpd/1.4.45
Content-type
text/javascript; charset=UTF-8
Content-Length
110291
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2EBB
77 KB
29 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
bbbef7fc3aa998d45c6380e099ceb31f2af4c9bed8e9c9968653f78cd876e88d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29339
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
truncated
/ Frame CA01
206 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4377d3a42638a46178ac47f7f549cb5232f3a0c284f63b3023931fb83021225f

Request headers

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

Response headers

Content-Type
text/javascript
Cookie set map
ih.adscale.de/ Frame CB75
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
uu=70509bc6c0534a0883c056b879a2edf6; tu=4#2298012011#48~fffc460d8e87922cc9ae8352be09f974~436833~0~0; ng=2#2168199350#26209999#0#d7~1&d10~1&d2~3&d4~2&d11~3&d8~2&d9~1&d12~3&d1~1&d3~3
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Fri, 01 Nov 2019 09:19:37 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Content-Length
673
Connection
keep-alive
Set-Cookie
tu=4#1749806005#48~fffc460d8e87922cc9ae8352be09f974~436833~0~0#101~~436833~436833~1#38~~436833~436833~1#39~~436833~436833~1#40~~436833~436833~1#72~~436833~436833~1#42~~436833~436833~1#75~~436833~436833~1#63~~436833~436833~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
b9af30bd-3f20-4b2a-bd09-92adc652964f
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/b9af30bd-3f20-4b2a-bd09-92adc652964f?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=1572599977
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 google
last-modified
Fri, 01 Nov 2019 09:19:37 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
tb
15.taboola.com/
30 KB
31 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=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1572599977328&tagid=&cntry=BE&platform=1&sesid=22bef39956d938d5127c78cf97b651dc&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1572599976792&geolat=&geoing=&deviceifa=&appid=&sd=v2_22bef39956d938d5127c78cf97b651dc_9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28_1572599976_1572599976_CNawjgYQrMVBGNimjbLiLSABKAEwFjjqxgdA54YQSN3sEFD___________8BWABgAA&ri=cd54273b2260f1b2272de0918652fe91&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
33c2a4f387faadfa74a45dacf47d7859ee48b2245b56690ec54b2d15edbcc881

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599977.406090,VS0,VE14
machineid
1429
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
expires
Sat, 26 Jul 1997 05:00:00 GMT
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4075-HHN
feed-card-placeholder.20191029-10-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20191029-10-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
301c1b18b937f14b2ca54c68411c9ddc387776b295516a34eaecf7be6211c12c

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
Y4YriMu4NhAWUdaIO6oeuPjv2AQnRTJC
content-encoding
gzip
etag
"d2ac09bbef99c697d89d05959729f1df"
age
78
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
1268
x-amz-id-2
++exawyrYf6ozUdHb1piXW3BrRskp8QVGBx1YsDomMp1voNALNt8JqDVRPUn+2nXsr+9hAUxBg0=
x-served-by
cache-fra19173-FRA
last-modified
Wed, 30 Oct 2019 14:09:08 GMT
server
AmazonS3
x-timer
S1572599977.349310,VS0,VE0
date
Fri, 01 Nov 2019 09:19:37 GMT
vary
Accept-Encoding
x-amz-request-id
459E245830303E7D
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
1
x-cache-hits
298
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.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
31
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
AWcIhzzomFpHe8si5YbJiVnnNX5t8zaqWT6iUnl1jrs0orHCeA8qFpBimZz6F0EbOu64vJC5TJQ=
x-served-by
cache-fra19173-FRA
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1572599977.351986,VS0,VE0
date
Fri, 01 Nov 2019 09:19:37 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
581ABC3EA067DAB9
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
1
x-cache-hits
62
userx.20191029-10-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20191029-10-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
52474baa6d61259ace4625b8fbd1e4d97d87403ab3977e9711606dc5524bc394

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
r4ZDcqibKipU._YwqWBuo2KCzbfp4Zem
content-encoding
gzip
etag
"01c352e52c73c64dab02d3da8c4e8c2c"
age
39
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
7710
x-amz-id-2
lkcx/Adog2nKueEs1+oTL2TkTDPj/ns1m0TXToasaKwAuw/UO4Hc0cQHm3TgPzUAOVabSE+K+xc=
x-served-by
cache-fra19173-FRA
last-modified
Wed, 30 Oct 2019 14:09:14 GMT
server
AmazonS3
x-timer
S1572599977.359069,VS0,VE0
date
Fri, 01 Nov 2019 09:19:37 GMT
vary
Accept-Encoding
x-amz-request-id
A8FFA0054FFB1630
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
1
x-cache-hits
87
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame EBED
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=d151e11f-3218-4d56-b244-24860f5c095e
0
52 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d151e11f-3218-4d56-b244-24860f5c095e
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 - 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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599978.733841,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19173-FRA

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d151e11f-3218-4d56-b244-24860f5c095e
Date
Fri, 01 Nov 2019 09:19:37 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
/
trc.taboola.com/sg/rubicon-network-display/1/rtb-h/ Frame EBED
Redirect Chain
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
0
0
Image
General
Full URL
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
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 - Fastly, 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/78.0.3904.70 Safari/537.36

Response headers

Redirect headers

Pragma
no-cache
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Location
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Cache-Control
no-cache,no-store,must-revalidate
Content-Type
text/html
content-length
0
X-RPHost
3bafef7aa4e37890defcd73f0a080481
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame EBED
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=cWma_hAZiVKvuCXv-OhoH49PtD9Sj1g4DK1xhqdnP5s%3D
45 B
223 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=cWma_hAZiVKvuCXv-OhoH49PtD9Sj1g4DK1xhqdnP5s%3D
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

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

Response headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:52 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599993.674372,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19173-FRA

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=cWma_hAZiVKvuCXv-OhoH49PtD9Sj1g4DK1xhqdnP5s%3D
Date
Fri, 01 Nov 2019 09:19:52 GMT
Server
nginx
Connection
close
Etag
"cWma_hAZiVKvuCXv-OhoH49PtD9Sj1g4DK1xhqdnP5s="
Content-Length
0
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/ Frame EBED
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=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Decaa5dbb-f479-4c0...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Decaa5dbb-f479-4c00-a34b-7c906c6d46c1
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599978.433739,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599978.399061,VS0,VE9
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=ecaa5dbb-f479-4c00-a34b-7c906c6d46c1&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Decaa5dbb-f479-4c00-a34b-7c906c6d46c1
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame EBED
Redirect Chain
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=cO4hTollQPHZ&ev=1&pid=562107
0
219 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=cO4hTollQPHZ&ev=1&pid=562107
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 - 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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:44 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599985.770333,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19173-FRA

Redirect headers

Date
Fri, 01 Nov 2019 09:19:44 GMT
Via
1.1 varnish
X-Cache
MISS
P3p
policyref="/bh/w3c/p3p.xml", CP="NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT"
X-Cache-Hits
0
Connection
keep-alive
Content-Length
0
X-Served-By
cache-hhn4042-HHN
Server
Jetty(9.4.7.v20170914)
Vary
Accept-Encoding
Content-Language
en
Location
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=cO4hTollQPHZ&ev=1&pid=562107
Cache-Control
private, max-age=0, no-cache, no-store
Accept-Ranges
bytes
Content-Type
text/plain; charset=utf-8
Cw-Server
bh-deployment-557c8c5c4f-c2b7d
Expires
-1
rtb-h
match.taboola.com/sg/appnexus-network/1/ Frame EBED
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5233567564189119990&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D5233567564189119990
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5233567564189119990&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D5233567564189119990
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599977.445387,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
8
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599977.411307,VS0,VE8
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5233567564189119990&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D5233567564189119990
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/google-network/1/ Frame EBED
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=CAESENsuWI9FftzYffg6_BoVTFI&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENsuWI9FftzYffg6_BoVTFI&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3DCAESENsuWI9FftzYffg6_BoVTFI%26goo...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENsuWI9FftzYffg6_BoVTFI&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3DCAESENsuWI9FftzYffg6_BoVTFI%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599977.454488,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
10
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599977.415396,VS0,VE10
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENsuWI9FftzYffg6_BoVTFI&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3DCAESENsuWI9FftzYffg6_BoVTFI%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/ Frame EBED
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990
0
70 B
Image
General
Full URL
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990
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 - 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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
18
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599977.431224,VS0,VE18
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19173-FRA

Redirect headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:39 GMT
X-Proxy-Origin
185.210.217.115; 185.210.217.115; 307.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.70:80
AN-X-Request-Uuid
08ad33db-8ee5-43d4-8338-88277ccc27a4
Server
nginx/1.13.4
Access-Control-Allow-Origin
*
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"
Location
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5233567564189119990
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame EBED
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=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D691b0b3e-dd26-48f3...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D691b0b3e-dd26-48f3-ba89-fd6ddeb6c780
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599978.579314,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599978.542353,VS0,VE9
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=691b0b3e-dd26-48f3-ba89-fd6ddeb6c780&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3D691b0b3e-dd26-48f3-ba89-fd6ddeb6c780
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame EBED
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Ddabdd010-2a79-4faf-8d...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Ddabdd010-2a79-4faf-8dcd-4b30a6495b62
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599978.218486,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599978.184315,VS0,VE9
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=dabdd010-2a79-4faf-8dcd-4b30a6495b62&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3Ddabdd010-2a79-4faf-8dcd-4b30a6495b62
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame EBED
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 - Bidtellect Inc., US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

X-ServerName
Track003-dc3
Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:52 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 EBED
0
292 B
Image
General
Full URL
https://cds.taboola.com/?uid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&_r=4835709
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
130.211.13.252 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
252.13.211.130.bc.googleusercontent.com
Software
nginx/1.16.1 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:40 GMT
Via
1.1 varnish
Server
nginx/1.16.1
X-Timer
S1572599981.721938,VS0,VE28
X-Served-By
cache-bwi5034-BWI
X-Cache
MISS
x-envoy-upstream-service-time
0
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame EBED
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1871316018019192582&expires=30&ssp=taboola
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3De6ddce6b-41f2-4c60-93...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3De6ddce6b-41f2-4c60-93dc-da1301aab082
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:41 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599982.643185,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN

Redirect headers

x-vcl-time-ms
8
date
Fri, 01 Nov 2019 09:19:41 GMT
via
1.1 varnish
server
nginx
x-timer
S1572599982.608968,VS0,VE8
x-served-by
cache-fra19173-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e6ddce6b-41f2-4c60-93dc-da1301aab082&tbid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28&query=taboola_hm%3De6ddce6b-41f2-4c60-93dc-da1301aab082
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=416249672&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=776271333.1572599976&tid=UA-204785-4&_gid=315022183.1572599976&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=505891448
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:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
207691
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
259 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:37 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-fra19173-FRA
pragma
no-cache
server
nginx
x-timer
S1572599977.376228,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
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
57 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 01 Nov 2019 09:19:37 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-fra19173-FRA
pragma
no-cache
server
nginx
x-timer
S1572599977.377667,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
le.php
media.oadts.com/www/delivery/ Frame 2EBB
43 B
401 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=6154041009
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2EBB
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=47864428300
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2EBB
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=24897829208
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame 2EBB
12 KB
12 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg2175323768&startmuted=1&cb=0.8439613120729044&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
888f119017e20c10b7bb85058d6a07812dd0f2730dc417200ddaa5fc74c66c73

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
11843
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2EBB
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=52860014181
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
655 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/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 - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
19643
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19173-FRA
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
S1572599977.415883,VS0,VE0
date
Fri, 01 Nov 2019 09:19:37 GMT
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
1
x-cache-hits
17157
getAd
video-adserver.ibillboard.com/ Frame 2EBB
0
0

le.php
media.oadts.com/www/delivery/ Frame 2EBB
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.12500566215020492&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
creative_js.js
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
4 KB
2 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191029-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 a436b6df4b0d1bd189edf722b5d2a523.cloudfront.net (CloudFront), 1.1 varnish
age
1480999
x-amz-meta-mtime
1499351521
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
1827
x-served-by
cache-fra19173-FRA
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1572599978.770203,VS0,VE0
etag
"0df6cb700db4e2c8b3b7dcb734e91cb0"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Bz1oMGf3im0GdaDR1lpP366TMdyCBt5NXOq1IlamWrJqJW2zqe6XsA==
x-cache-hits
1239906
view
securepubads.g.doubleclick.net/pcs/ Frame 64C1
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst-pZ7TWoWtHKD1h5JHfXH0m_V33Bcl8fdq0Azwh8CNVXdukyFMF8UVRO9uSJY0-s-jKS2PEcCX-mbdDEhq8hmwu6BOUtRTskjO_6vZyEL1iTcc-oUo8HfEbnlozA2Y6Zu4MwQWsRpfLlhTKFop_q3kVbT6Y7TVRzWWKgs9ZGLVvS3ho42KntL_Z5xZNEVSINQsfAwo2M505kGBhz9qAIEZ2AeOBN6qcOsP4hKDj352Yvsqu9Ow_ZTKy_1eQluxg8iDnPbcw4T0RvaQ6QSo&sig=Cg0ArKJSzGpx2Hr0sYGIEAE&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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:37 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-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 64C1
47 KB
15 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
652c3771d069e628d4e2dc42f6fcd663482f99cb14f550e43bd7755ff8b4fe6c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"323 / 32 of 1000 / last-modified: 1572538918"
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-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
14899
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 64C1
77 KB
29 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
bbbef7fc3aa998d45c6380e099ceb31f2af4c9bed8e9c9968653f78cd876e88d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29339
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
pubads_impl_2019102401.js
securepubads.g.doubleclick.net/gpt/ Frame 64C1
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
b40c3274538f0155c83d1a9e4d3a68d94d61425a71cddee3ffd7d38a99465733
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58552
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 64C1
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1198694115107844&correlator=929835639443015&output=ldjh&impl=fifs&eid=21064123%2C21064826%2C21064170%2C21064679%2C21065018&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A268435456%2C2%3A268435456%2C8%3A268435456&sc=1&sfv=1-0-36&ecs=20191101&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-728x90&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=728x90&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&abxe=1&lmt=1572599977&dt=1572599977607&dlt=1572599977472&idt=129&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adxs=429&adys=121&adks=4143599050&ucis=jyn1ss4z0sik&ifi=1&ifk=1061875100&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=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1085897701.1572599978&ga_sid=1572599978&ga_hid=1551783225&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
5ee02fa61d67a2914a23203783a7dac93aecbdc55d0514195cf9b8ee95fb8a70
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
8210
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369431
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_2019102401.js
securepubads.g.doubleclick.net/gpt/ Frame 64C1
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019102401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
9c14e216c7aed649a11d2b47f8c6cf9f586ba7f426132ead03c4061b054ffcbd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24997
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame 64C1
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

truncated
/ Frame 64C1
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bc3795db6cf62ab319ad80ef6a45e970eb0fc201645ffd488adacff17e87d50d

Request headers

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

Response headers

Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 1007
0
134 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv_d__p8oW-PXQgBaeg046bs9MtAY43LT90vFUUbxU31D6KzscxT2iXaHAV8GsNmMotSo7pY-Dn2OjPCTdQb2NObPRKzxzuYROShqggGMGNf7TJv4WEU1CZCuJ_794_6ODpFHetJ71BG5VPZC3LQsdUn5Sfe2kAF3pW4jnAVzAN12pq3L0xw-ud9QrFXAhYBvmzSTGS23YpzKxUTD3Ap8eJYKMQJPzb7XXcTq24D9AeBcrlYIo2AnrPO8fm9S1THvY8rOCzzrt09tt82SFcAA&sig=Cg0ArKJSzHZ0h6enySEfEAE&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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:37 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-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
expires
Fri, 01 Nov 2019 09:19:37 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame 1007
47 KB
15 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4058609ccfe2c56c21b54e1220826f52a1b776664ac077c0c3838b65e0be6192
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"323 / 821 of 1000 / last-modified: 1572538918"
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-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
14905
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1007
77 KB
29 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
bbbef7fc3aa998d45c6380e099ceb31f2af4c9bed8e9c9968653f78cd876e88d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29339
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame CA01
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=9951944479
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.52 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:38 GMT
Last-Modified
Fri, 01 Nov 2019 08:07:53 GMT
Server
AmazonS3
x-amz-request-id
D1A16A1FE0D8B8E1
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
WIGsiCorzkw9qrV7O+naDl+2GLPovUK8q0/MLHN8FeHaMFaGSnfI554WwZk6WVvGlcSAV1Di1lU=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame CA01
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=6586299303
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
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

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 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
Fri, 01 Nov 2019 09:34:37 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame CA01
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=5244233789
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Via
1.1 80c1ad5f9352d00b95a9da73eb6b6be5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
IA6GncKIPg22dOjJgNadgakVKmUG5yfRLfD30ItRXDUVQEcgYTo4YA==
Expires
0
pubads_impl_modern_2019102401.js
securepubads.g.doubleclick.net/gpt/ Frame 1007
144 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019102401.js?21065059
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.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
55cc01efeec52b42877704ce9735d1c266528f18bbb1f74120752a054974b04c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
56277
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 1007
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:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
st
imprammp.taboola.com/ Frame AAA3
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=B137B33E781077083601186798433&cicmp=1657475&cijs=1&dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&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.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=B137B33E781077083601186798433&cicmp=1657475&cijs=1&dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
t_gid=9d779512-a36e-4da8-b4b9-bd0814fea543-tuct4b57e28
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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.13.12
accept-ranges
bytes
date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 varnish
x-served-by
cache-hhn4075-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1572599978.800369,VS0,VE9
content-length
0
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/23_14_21/infra/
662 KB
148 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fdabf266bf690c50a183e1bd4a24361f850940d704eb63098a1acdf47a5d1b62

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 b16802a1e349d80b7688070778305ae2.cloudfront.net (CloudFront), 1.1 varnish
age
158822
x-amz-meta-mtime
1572438858
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1572438872
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
150682
x-served-by
cache-fra19173-FRA
last-modified
Wed, 30 Oct 2019 12:34:34 GMT
server
AmazonS3
x-timer
S1572599978.805481,VS0,VE0
etag
"202aa6ef5c2414bf4ec3f4fb9d0c7b31"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
1Fq9D5PBkHIxq2JzHXO_JabdzBV-pJeMPE7LdLtkTe-w5TBcT9bdVg==
x-cache-hits
233363
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_21/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_21/assets/css/cmOsUnit.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
via
1.1 f960fa0538fdb326fc338e984fa7ece9.cloudfront.net (CloudFront), 1.1 varnish
age
158823
x-amz-meta-mtime
1572438856
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1572438862
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6240
x-served-by
cache-fra19173-FRA
last-modified
Wed, 30 Oct 2019 12:34:24 GMT
server
AmazonS3
x-timer
S1572599978.803545,VS0,VE0
etag
"1112e8ccb1e3ed0d2e59d31564a5dfae"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
zkZWwUCxNIYWh7r2UPM-XicfJfEVWbBSMvgtCs9__5lnfrPIUBZEqw==
x-cache-hits
313666
/
ssl.2.damoh.giga.de/b7117b9dc6813b8e61c13e8b5690267997348c91/ Frame CA01
653 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/b7117b9dc6813b8e61c13e8b5690267997348c91/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.9.51.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.51.9.176.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 01 Nov 2019 09:19:37 GMT
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:24 GMT
Server
AmazonS3
Etag
"063da71572f57793ea4125f50b418f84"
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-1
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
publishertag.prebid.js
static.criteo.net/js/ld/
42 KB
14 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.prebid.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.2.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b2dbb2765ef8da15ab2a6f68aba37ee837a9347911283dea527b4fc5f3175c2f

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
content-encoding
gzip
last-modified
Mon, 14 Oct 2019 12:15:44 GMT
server
nginx
etag
W/"5da466f0-a74a"
status
200
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Sat, 02 Nov 2019 09:19:38 GMT
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9ODcUAAKktFLkqFFlqwF23A52AwwA/k0FQEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A25A00ALlnFBUkzF2BPpGAAAAAAABVPaAPCAAFAAVPaTA5iAPAAAAAAkaABA5iAZBAAOA55A55A85B55A58E55A55AGAxwA30A33ArA5iAPADAAAAkaAPA5iAPAAAAAAkaAIA5iASksFhFjAAAAAAAAAAAAEAAAVPaAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAKAHvFvnFslFgBEkYFAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAkaAAAAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFVYMSUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:37 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:36 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 1007
12 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2110907769614172&correlator=2620285042289838&output=ldjh&impl=fifs&eid=21065059%2C21064679%2C21065017%2C21065061&vrg=2019102401&guci=1.2.0.0.2.2.0.0&plat=1%3A268435456%2C2%3A268435456%2C8%3A268435456&sc=1&sfv=1-0-36&ecs=20191101&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x600&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C300x600&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&abxe=1&lmt=1572599977&dt=1572599977916&dlt=1572599977724&idt=180&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adxs=1318&adys=121&adks=2714360146&ucis=a1jw27duzjv2&ifi=1&ifk=1431968171&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=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=646020694.1572599978&ga_sid=1572599978&ga_hid=1497845952&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019102401.js?21065059
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
cafe /
Resource Hash
2b8ce418e95d382001f5c85da4dfd174b01943348092f94f668953d248e73f3e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
content-encoding
br
x-content-type-options
nosniff
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
6949
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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_modern_rendering_2019102401.js
securepubads.g.doubleclick.net/gpt/ Frame 1007
60 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_rendering_2019102401.js?21065059
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019102401.js?21065059
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
5cfc0721775a06fa3be9edc41c21eaa73d57f37fef61e185e363768876ed5b81
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 24 Oct 2019 13:07:07 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24197
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame 1007
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019102401.js?21065059
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

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

Request headers

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

Response headers

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

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-36/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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
3516
date
Fri, 01 Nov 2019 04:46:25 GMT
expires
Sat, 31 Oct 2020 04:46:25 GMT
last-modified
Wed, 16 Oct 2019 15:42:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
16392
alt-svc
quic=":443"; ma=2592000; v="46,43",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 64C1
78 KB
29 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_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c0b74996deebf9409b61191121b6d7a8156ba2cfb1db0b3baa429d0d73f1d3b8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29301
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:38 GMT
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9OEBXAA/k0FVImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A25A00AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3yA15A55A33A4yA2BELlnFCUkzFYBPvKAAAAAAAB/NVAPCAAFAA/NVTl5/APAAAtGA5BABl5/AZBAAOA55A55A85B55A58E55A55AFA42A5xAxBErl5/ASksFMFjAAAAAAAAAAAAEAAA/NVAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA2wA5wAy2A13AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A22A3xA52A2xAGAihFuuFlyFKA03A22A3xA52A2xAKA03A22A3xA52A2xAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA5BAYLAaBAFAAAl5/AAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFLOL9VA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:37 GMT
hic_qos
ssl.1.damoh.giga.de/ Frame CA01
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,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:38 GMT
Last-Modified
Wed, 15 May 2019 14:42:46 GMT
Server
openresty/1.15.8.2
ETag
"5cdc2566-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 93B8
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2a120cd7d2cd60ebdd670683471d05fd9cb501228623c9fa3420b008aa9e8446

Request headers

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

Response headers

Content-Type
text/javascript
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9OFBYAA/k0FUMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A25A00AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3yA15A55A33A4yA2mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx5A0wAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A35A5xALlnFDUkzFnBPiCAAAAAAABnV+APAAAFAAnV+TbosAPAAAmUA5BABbosAZBAAOA55A55A85B55A58E55A55AGAy1A1zAz1ArbosAP/AAmUA5BAHbosASksFGFjAAAAAAAAAAAAEAAAnV+AAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA2wA5wAx5A0wAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A21A54Az1A51ADAzrF5BFKA03A21A54Az1A51AKA03A21A54Az1A51AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAsEAYJAFAAAbosAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFNNltYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:37 GMT
/
ssl.2.damoh.giga.de/c096df815738740a40e14adf5538846762e5803c/ Frame CA01
109 B
671 B
XHR
General
Full URL
https://ssl.2.damoh.giga.de/c096df815738740a40e14adf5538846762e5803c/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvSmFpdnV4SXViYWhwaGk9Vm9KYWl2dXhJdWJhaHBoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5IbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5YdChsKTthLld0KG0pO2EuSXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk9iLmxlbmd0aCl7dmFyIGE9bC5PYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5ldSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5vaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUub2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3U9dGhpcy5hWzNdO3RoaXMuZ209dGhpcy5hWzhdO3RoaXMuS3M9dGhpcy5hWzhdO3RoaXMubXE9dGhpcy5hWzRdO3RoaXMuQnY9dGhpcy5hWzNdO3RoaXMuYnY9dGhpcy5hWzddO3RoaXMudnA9dGhpcy5hWzddO3RoaXMuTXI9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNV19Yy5CaT1iO2IucHJvdG90eXBlPXtydTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuc3U6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nbTp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3M6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcToKdGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJ2OnRoaXMuYXYoYSl9LGF2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnA6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk1yOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuQml8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnJ1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhvPSExO3RoaXMucGI9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5udC5iaW5kKHRoaXMpKTsKdGhpcy5xYj17fTt0aGlzLlVnPXt9O3RoaXMuamY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtBdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnFiW2JdKyJfIik7cmV0dXJuIGF9LGJjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxyYjpmdW5jdGlvbihhKXt0aGlzLnFiW2FdfHwodGhpcy5xYlthXT0wKTt0aGlzLnFiW2FdKz0xOzU8dGhpcy5xYlthXSYmIXRoaXMuVWdbYV0mJih0aGlzLlVnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LAppRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LG50OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLm10KGEuZGF0YSl9LG10OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmCmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSmcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSmc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LEhuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMudmEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5ucShhKSlyZXR1cm47KGI9dGhpcy5yZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LG5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHpnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxJcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxJZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sZ3U6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLm5wKGIpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLmd1KGEsZFtmXS5rZXksZFtmXS52YWx1ZSl9LExvOmZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKwphLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sbnA6ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTG8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCk1iOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sT2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSwKeT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixnPXAmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHApJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sRXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLldiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cDthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGlyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxUazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LG9vOmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmkoKXx8YS5jaigpfHxhLmlyKCl8fGEuemwoKXx8YS5RbSgpfHxhLlRrKCl8fGEuWmwoKX19O3JldHVybiBudWxsIT1hLm9vKCl9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sRWI6ZnVuY3Rpb24oYSl7YT10aGlzLnZhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sSXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy52YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LHF1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEVnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5oaShiKSsiOiIrdGhpcy5oaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMucGI9YX0sQmc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5wYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkJnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHB0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSx0dTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYmMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLnphKGYsITApO2Y9bC56YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5XbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLklyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuemcoYSkpcmV0dXJuIHRoaXMuemcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkhuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri56YShhLGUpO2U9Ri56YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LGNzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLkFiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG9oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5BYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5jcyhmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sZXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LHFvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5Wanx8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5ldD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi52cz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Xdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLllwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYnc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi56bj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IubHA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Cbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuQW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLm9pPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IueHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm9nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Wdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iud3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iud3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNrPXRoaXMuYVsxXTt0aGlzLlFyPXRoaXMuYVs0XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuV209YjtiLnByb3RvdHlwZT17Qms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rcjp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLldtfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Cayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe30KYy5Xaj1iO2IucHJvdG90eXBlPXtCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKwoobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxxZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx4cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrCiIyIn0sYWg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZSh0aGlzLkVxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuV2p8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuem89dGhpcy5hWzldO3RoaXMuTms9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5tbj1iO2IucHJvdG90eXBlPXt5bzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem86dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMubW58fGxhLHZjPW5ldyBsYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy55byg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2Muamo9Yn0pKGMpO3ZhciBNPWMuamp8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzEwXTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMucGw9YjtiLnByb3RvdHlwZT17S2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxrOnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMucGx8fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5Layg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5OYj0wO3RoaXMuV2E9MTUwO3RoaXMuUWI9MDt0aGlzLll0KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5OYjw9dGhpcy5XYT8odGhpcy5OYisrLHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxPdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5OYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sWXQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sClI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TiYmTi5qaCYmTi56dShiKX0sYXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LERyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3g6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5ObHx8dDsoZnVuY3Rpb24oYyl7Yy5QbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTmI9MDt0aGlzLldhPTUwO3RoaXMuWD0KbnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5IYj0iIjt0aGlzLnRnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LGl1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGF1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sJHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLldhJiYodGhpcy5OYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTmMpKX0sCmlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LApFZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHV4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlhxKCl8fHRoaXMuRG4oKTt0aGlzLkVkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRG46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxOaDpmdW5jdGlvbihiKXt0aGlzLkhiPWJ9LFp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LEloOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxleDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuSGImJgooYj0hMCk7cmV0dXJuIGJ9LHB4OmZ1bmN0aW9uKCl7dGhpcy50Z3x8KHRoaXMudGc9ITApfSx3ZTpmdW5jdGlvbigpe3JldHVybiExfSxXdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5QbHx8cTsoZnVuY3Rpb24oYyl7Yy55aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLldjPTA7dGhpcy5yaD0zMDt0aGlzLlViPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmtpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuWnQoYSl9LApnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMua2l8fCh0aGlzLmtpPSEwLGUuT2UoKSl9LFdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5lYyYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sd3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09e30sd2luZG93W2Eua2EoKV1bYi5sYSgpXS5pbml0aWF0b3I9ZS5iYygpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuYmMoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLmJjKCldPTF9LEFyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJgp3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5iYygpJiYodGhpcy5uZigpLGE9ITEpO3JldHVybiBhfSxIOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnlhKCkpe3RoaXMud3IoKTtpZighdGhpcy5BcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5jaSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMueWEoKXx8KHRoaXMuVWIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxjaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVWImJjA8dGhpcy5VYi5sZW5ndGgmJih0aGlzLlViPWUudW5pcXVlKHRoaXMuVWIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlViLmpvaW4oIiwiKSkpOwppZih0aGlzLmliKXtmb3IodmFyIGg9MDtoPHRoaXMuaWIubGVuZ3RoO2grKyl0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXT09dGhpcy5yY1tiXSYmYS5wdXNoKHRoaXMuaWJbaF0uZGV0YWlsKSx0aGlzLnJjW3RoaXMuaWJbaF0ucmVhc29uXTx0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxkeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxmdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PQp0aGlzLk9mfSxNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5QZn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuV2N9LG1mOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LENxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sZnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnlpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVsyXTt0aGlzLlZuPXRoaXMuYVsxXTt0aGlzLlNyPXRoaXMuYVszXTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLkVrPXRoaXMuYVs0XTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLmxuPXRoaXMuYVsxXTt0aGlzLnNwPXRoaXMuYVsxMF07dGhpcy5qPQp0aGlzLmFbNV19Yy5SdD1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG86dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBvOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Wbjp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNyOnRoaXMuYWwoYSl9LGFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ibDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWs6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVpOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sbjp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLlJ0fHxvYSwKeGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Eanx8CnBhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5OdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLkVqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Gaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcmE9Yy5Ganx8cmE7KG5ldyByYShyKSkuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RaT10aGlzLmFbOV07dGhpcy52cj10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzFdO3RoaXMudHQ9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzRdO3RoaXMubHc9dGhpcy5hWzRdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5ObT1iO2IucHJvdG90eXBlPXtQaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZyOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FcDp0aGlzLlprKGEpfSxaazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJGs6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR0OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuWHA6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmx3OnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuTm18fHNhLHljPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlBpKDQpOyhmdW5jdGlvbihjKXtjLnhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy55ZygpO3RoaXMuQWcoKTt0aGlzLmtwPSExfSx5ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8CiJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSxBZzpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkphKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5aKGEpfX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJgoxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcykpfSxRZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkdkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7CmEuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuUmUmJigwLHRoaXMuUmUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxBYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmCmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sd2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnhrfHx0YTsoZnVuY3Rpb24oYyl7Yy53az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxNOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnliPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5lZT1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnliPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnliPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJgpiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTt0aGlzLlljPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5yaCYmCiF0aGlzLnlhKCkmJih0aGlzLnliPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy55YSgpJiYodGhpcy5vYSgpLHRoaXMuZ2V0UGxheWVyKCkua3A9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkhiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLldlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnJoJiYhdGhpcy55YSgpJiYodGhpcy55Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmCnRoaXMuWmMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMudSgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlpjLmxlbmd0aD49dGhpcy5lZSYmdGhpcy5tKCkpfSxmczpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy50ZT50aGlzLnVlJiYoYj0hMSksdGhpcy5IKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEueWcoKSxhLkFnKCksYS5mY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB1YT1jLndrfHx1YTsoZnVuY3Rpb24oYyl7Yy55az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuRHIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTSgpLGguZygpKX19dGhpcy5UKCl9fSxZdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKeXE6ZnVuY3Rpb24oKXt2YXIgYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLkFiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB2YT1jLnlrfHx2YSx3YT1uZXcgdmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXY9dGhpcy5hWzJdO3RoaXMueXA9dGhpcy5hWzNdO3RoaXMuQWk9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5ScT1iO2IucHJvdG90eXBlPXtkdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXY6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuemkoYSl9LHppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuUnF8fHhhLHpjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5kdig0KTsoZnVuY3Rpb24oYyl7Yy5FbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5OZChiKX0uYmluZCh0aGlzKSl9LE5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5YJiZ0aGlzLlgoKX0sRmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5IYz10aGlzLkNhPXRoaXMuY2Q9ITE7dGhpcy5EaD1lLk1iKDEwKTt0aGlzLmppPSEwO3RoaXMud2M9dGhpcy5ZZz0hMTt0aGlzLnRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy51aCgpLHRoaXMuU28oKSx0aGlzLnRiKCkpfSx0czpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8KITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkssIjsiLHR5cGVvZiBiLkssIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSz9iLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5IYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5IYT9iLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkhhP3R5cGVvZiBiLmltYS5IYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYi5LJiZiLksuSGE/Yi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLksmJmIuSy5IYT90eXBlb2YgYi5LLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5hZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5iZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLApiLmltYT9iLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5LP2IuSy5xYToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5rZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSz9iLksua2U6InVuZGVmaW5lZFgiLCI7IixiLks/dHlwZW9mIGIuSy5rZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkRoKX0sQ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxhYzpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLkNiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5IYyl7dmFyIGI9CnRoaXMuQ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuSGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5IY30sQnI6ZnVuY3Rpb24oKXtpZighdGhpcy5YZyl7dmFyIGI9dGhpcy5DYigpLGE9dGhpcy56cigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuWGc9ITApfXJldHVybiB0aGlzLlhnfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2QmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLmNkPSEwKTtyZXR1cm4gdGhpcy5jZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLkZ0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLndjPSEwO3ZhciBiPXRoaXMuTGcoKTtpZihifHx0aGlzLnlhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueGM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIiwKZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnhjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy54Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucWcmJmIuYWRzJiYodGhpcy5xZz1iLmFkcyk7cmV0dXJuIHRoaXMucWd9LApTbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuVilob21hZFV0aWxzLlVhJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLkxnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApKX0sdWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuQnIoKSl7dmFyIGE9dGhpcy5DYigpLGg9dGhpcy5hYygpO2EmJmgmJih0aGlzLkNiKCksdGhpcy5hYygpLHRoaXMud2N8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2M/dGhpcy53KCk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLkNiKCl9ZWxzZSB0aGlzLllnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpLGI9dGhpcy5hYygpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLllnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fAohYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxUbzpmdW5jdGlvbigpe3RoaXMuQ2N8fCh0aGlzLkNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5DYyE9Yi5hZHMuc3RhdGUmJih0aGlzLkNjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkNjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuQ2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxEYTpmdW5jdGlvbigpezA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8KKHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy55YSgpfHwoYnx8KHRoaXMuamk9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5IKHRoaXMuamksZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGFwOmZ1bmN0aW9uKCl7dGhpcy5meHx8KDEwPHRoaXMuSXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5JdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLk10KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFwKCl9LmJpbmQodGhpcyksNTApKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5Kdil7dGhpcy5Kdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLkRtfHx6YTsoZnVuY3Rpb24oYyl7Yy5GbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5UaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuVGgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sVGg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuemUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5uYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlIoYSksKG5ldyB6YShhLHRoaXMuSikpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5RYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLk5jKX19KX0pKGMpO3ZhciBBYT1jLkZtfHxBYSxCYT1uZXcgQWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR289dGhpcy5hWzZdO3RoaXMudG89dGhpcy5hWzJdO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuZ2w9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLkdpPXRoaXMuYVszXTt0aGlzLkV1PXRoaXMuYVs3XTt0aGlzLlR0PQp0aGlzLmFbMTBdO3RoaXMubWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5rbz1iO2IucHJvdG90eXBlPXtGbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR286dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRvOnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5XdTp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2w6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2k6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuU3QoYSl9LFN0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHQ6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5tbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIENhPWMua298fENhLEFjPW5ldyBDYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLkZvKDQpOyhmdW5jdGlvbihjKXtjLkJsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuWmU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmNhKCk7cmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LGp0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuSGIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmVjJiYoMDw9aC5pbmRleE9mKGQpfHxhLnpkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5aZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5aZSsrO2lmKDEwPHRoaXMuWmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpOwp2YXIgRGE9Yy5CbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy52ZSlpZih0aGlzLklifHwodGhpcy5JYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkliKyssMTU8dGhpcy5JYil0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5DYSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuaHE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5ocT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLmp0KGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpO3ZhciBFYT1jLkFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPQoxNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBEYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBFYShoLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRmE9Yy5DbHx8RmEsR2E9bmV3IEZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJyPXRoaXMuYVs0XTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLnJrPXRoaXMuYVs3XTt0aGlzLmtrPXRoaXMuYVs5XTt0aGlzLmNrPXRoaXMuYVszXTt0aGlzLnZrPXRoaXMuYVs1XTt0aGlzLkJvPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnQ9YjtiLnByb3RvdHlwZT17cXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ycjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXI6dGhpcy5xayhhKX0sCnFrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yazp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua2s6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52azp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQm86dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5OdHx8SGEsQmM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMucXIoNCk7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLklnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMubHQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLmx0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTsKYnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLm9kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5vZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub2QpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSwkbzpmdW5jdGlvbigpe2UuZWgodGhpcy5vZCk7ZS5HZSh0aGlzLm9kKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG8oKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sS2U6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBJYT1jLm9rfHxJYTsoZnVuY3Rpb24oYyl7Yy5uaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuSCghMCl9fSl9KShjKTt2YXIgSmE9Yy5ua3x8SmE7KGZ1bmN0aW9uKGMpe2MucGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLklnKGIsImVsZW1lbnRJRCIpO2lmKGUuZWgoYSkmJihiPW5ldyBJYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSmEoYix0aGlzLkopKS5nKCk7cmV0dXJufXRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEthPWMucGt8fEthLExhPW5ldyBLYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLiRufHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5obSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sJHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxFbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgQT1jLlhqfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkRnPQp0aGlzLnRpPSExO3RoaXMudmg9ZDt0aGlzLlVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpO2UuJHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXtsLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5EZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuVWg/dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMudGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudmgmJnRoaXMudmgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuWWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT10aGlzLllkPSExfWMua2o9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5ZZD1hfSxjdTpmdW5jdGlvbihhKXt0aGlzLkdhPWF9LEt0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3d3OiJBZENsaWNrVGhydSIseXc6IkFkRXJyb3IiLHp3OiJBZFN0b3BwZWQiLEN3OiJBZExpbmVhckNoYW5nZSIsRHc6IkFkVGFnUGFyc2VkIixHdzoiQWRWaWRlb0NvbXBsZXRlIixKdzoiQWRMb2FkZWQiLEt3OiJBZFNraXBwZWQiLEx3OiJBZFN0YXJ0ZWQiLEF3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQnc6IkFkSW1wcmVzc2lvbiIseHc6IkFkQ3JlYXRpdmVWaWV3IixFdzoiQWRWaWRlb01pZHBvaW50IixGdzoiQWRQYXVzZWQiLEh3OiJBZFZpZGVvU3RhcnQiLEl3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuWWQsYltkXSl9LEp0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuWWQmJnRoaXMuS3QoKTt0aGlzLkdhJiZ0aGlzLkp0KCl9fX0pKGMpO3ZhciBPYT1jLmtqfHxPYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy56Yz0iIjt0aGlzLmxlPQp0aGlzLnljPXRoaXMuemI9bnVsbDt0aGlzLnRwPXRoaXMuT2I9dGhpcy5uaD0hMTt0aGlzLkthPSIiO3RoaXMuZ2g9ITE7dGhpcy54YT10aGlzLnNkPSIiO3RoaXMuYmg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5wYT1bXTt0aGlzLlJnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5UYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5rYz0iIjt0aGlzLmxjPVtdO3RoaXMubWM9W107dGhpcy5NZD1bXTt0aGlzLlJjPSIiO3RoaXMuQmI9ITE7dGhpcy53Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkdjPSExO3RoaXMuYnA9dGhpcy5TZD1udWxsO3RoaXMuUGg9dGhpcy5vYz10aGlzLnZnPXRoaXMuemY9CnRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlRnPSExO3RoaXMuU2c9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLlpqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnpiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMubmgsc2lkZWxvYWRzOnRoaXMuT2IsZGlzYWJsZXRlc3RzOnRoaXMudHAsaG9tYWRBbGlhczp0aGlzLkthLGlzSW5pdGlhbGl6ZWQ6dGhpcy5naCxnbG9iYWxDb25maWc6dGhpcy5zZCxjbGllbnRDb25maWc6dGhpcy54YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuYmgsCnNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuUmcsSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuVGIsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmJwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuWGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm5lLHVzZVN0cmljdENoZWNrczp0aGlzLlFkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnpmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkVhLHNlcnZlcklkOnRoaXMuTWgsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuUGgsdm1hcHM6dGhpcy5waSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sVnE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSx6cTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwKKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnFvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7Yz10aGlzLnZhKGEpO2Y/KHRoaXMuSWMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuTWMoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy56Y3x8dGhpcy56Ynx8dGhpcy55Y3x8dGhpcy5sZSkmJihnPQp0aGlzLnBzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuQnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuSWMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKCl7dmFyIGE9CiExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sQnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkthJiYwPHRoaXMuS2EubGVuZ3RoKXJldHVybiB0aGlzLkthO2ZvcihkIGluIHRoaXMuS2EpaWYoYj10aGlzLkthW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuU3c7cmV0dXJuIm5vbmUifSwKdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLk1oXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk9oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHNoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LG9zOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS52YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sST0wO0k8Zy5sZW5ndGg7SSsrKXt2YXIgaz0KZ1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnNoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5zaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHBzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJihhKz10aGlzLnpjKTtpZih0aGlzLnpiKWZvcih2YXIgYiBpbiB0aGlzLnpiKXRoaXMuemIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuemJbYl0pKTt0aGlzLnljJiYoYT10aGlzLm9zKGEsdGhpcy55YykpO3JldHVybiBhfSxabzpmdW5jdGlvbigpe3RoaXMuRWEmJgp0aGlzLkVhLmNsaWVudEFQSXMmJnRoaXMuVW8odGhpcy5FYS5jbGllbnRBUElzKX0sVW86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLmR1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5jdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5naD0hMDt0aGlzLnNkPWE7dGhpcy54YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRWE9ZXx8e307dGhpcy5abygpO3RoaXMuYnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueGEpdGhpcy4kcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy54YSl0cnl7dGhpcy54YT1iKCksdGhpcy5BYygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMueGEpdHJ5e3RoaXMueGE9Yix0aGlzLkFjKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApzYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sYnM6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuUXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sJHI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueGErdGhpcy5pZSgiY2xpZW50IiwtMSE9dGhpcy54YS5pbmRleE9mKCI/IikpKSx0aGlzLkFjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmtmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxpZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMuRWEmJnRoaXMuRWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkVhJiZ0aGlzLkVhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9ITEpO3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5iaD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5JZikpOwp0aGlzLlJiKCk7ZS5FYyhrLmV0KTsoYj1lLkViKHRoaXMudWQoKSkpfHwoYj1lLkViKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxRcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnViKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueGF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfX0sQWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMueGF9ZWxzZSBhPXRoaXMueGE7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9YS5jb25maWd8fCIiO3RoaXMuS2E9YS5hbGlhc3x8bnVsbDt0aGlzLlJnPWEuYWRwYXRofHwiIjt0aGlzLk1oPQpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmpjJiZ0aGlzLkthJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKSx0aGlzLlJiKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgQSh0aGlzLk1jKCkpLGQ9dGhpcy52YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuQ3UuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmtmKCJjdXN0b21lciIpO2E/dGhpcy5ZbD90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLllsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sQ3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy51YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnViKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnZnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnViKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy51YihiLmVuYWJsZWQpO3RoaXMua2M9CmIudGVzdGhpZGV8fCIiO3RoaXMubWM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5NZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUmM9Yi50ZXN0M3Bjb29raWV8fCIiO3RoaXMuemM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy56Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy55Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubGU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMubmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5PYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkVhLnZwYWlkPXRoaXMub2M7dGhpcy5QaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5waT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fAowO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkdjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5HYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLlh1KCkmJih0aGlzLmtjfHx0aGlzLm1jfHx0aGlzLmxjfHx0aGlzLk1kKT90aGlzLmVmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy5UYikpLHRoaXMucGUoKSx0aGlzLlJiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy52ZigpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuT3UoKX0sT3U6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksST1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEkpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLkFiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRWEmJnRoaXMuRWEucGxheWVyJiZ0aGlzLkVhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuVGIpKTt0aGlzLlJiKCl9LExkOmZ1bmN0aW9uKGEpe3RoaXMuWGM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKGEpKSx0aGlzLlJiKCksdGhpcy5wZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5raCgpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuWmgoKX19ZWxzZSB0aGlzLlpoKCl9LFloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpO3RoaXMuUnUoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmxjPXRoaXMuTWQpJiZ0aGlzLmxjLmxlbmd0aCl7dmFyIGQ9dGhpcy5sYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LFJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkxhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxaaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigpKTt0aGlzLlN1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5ZaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMubWMmJnRoaXMubWMubGVuZ3RoKXt2YXIgZD10aGlzLm1jLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuWWgoKX0sU3U6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxWaDpmdW5jdGlvbigpe2lmKHRoaXMuUmMpdHJ5e2UuTGUodGhpcy5SYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5CYj0hdGhpcy51YihhLmNjKTt0aGlzLnZmKCl9LmJpbmQodGhpcyksdGhpcy5XaC5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLldoKCl9ZWxzZSB0aGlzLnZmKCl9LFdoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLlRiKSk7dGhpcy5SYigpO3RoaXMucGUoKX0sa2g6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxSYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlhjJiYKKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuZmEoInQtb25saW5lLmRlIil8fGUuZmEoImdpZ2EuZGUiKXx8ZS5mYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5raCgpLCEwKTt0aGlzLlJjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLkpmKSk7dGhpcy5TZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlNkJiZ0aGlzLlNkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFlvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5WcSgpKXt2YXIgYT10aGlzLnpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxjaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0KImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGIsZCxjLHAsZyl7dGhpcy50ZHx8KHRoaXMudGQ9MCk7dGhpcy50ZCsrO3RoaXMudGQ+dGhpcy5TZyYmIXRoaXMuVGcmJih0aGlzLlRnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5TZywhMCkpO2E9bmV3IE5hKGEsYixkKTtjJiYoYS50aT0hMCk7cCYmZS5FcigpJiYoYS5EZz0hMCk7ZyYmKGEuVWg9ITApO3JldHVybiBhLmxvYWQoKX0sVm86ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkljKCl8fChhPXRoaXMudmEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRnU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMucGl9LFdvOmZ1bmN0aW9uKCl7dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy56YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMueXYuYmluZCh0aGlzKSx0aGlzLnh2LmJpbmQodGhpcykpfSx5djpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDsKdHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLiRwKCl9LHh2OmZ1bmN0aW9uKCl7fSwkcDpmdW5jdGlvbigpe2UuRWMoay5acCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0scGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk9iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLApudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy53Zn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LEFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSwKYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxPaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSwKaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLAplPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBQYT1jLlpqfHxQYSxsPW5ldyBQYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuZ2o9dGhpcy5hWzNdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuem09dGhpcy5hWzRdO3RoaXMudG09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMucnE9YjtiLnByb3RvdHlwZT17dG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5DbTp0aGlzLmZqKGEpfSxmajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmdqOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMucnF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi4kZyYmYS5mLiRnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuS2guYmluZCh0aGlzKSxtdXRlOnRoaXMuU2UuYmluZCh0aGlzKSwKdW5tdXRlOnRoaXMubnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlpiPXRoaXMuZGQ9ITE7dGhpcy5sbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLkVvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuYmQ9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuYmQ9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuS249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5YZT10aGlzLkhkPSExO3RoaXMucGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5tcD1lLmFhKDEwKTt0aGlzLkxiPWUuYWEoMTApO3RoaXMuSmI9ZS5hYSgxMCk7dGhpcy5RaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlNiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudmI9dGhpcy5wYz10aGlzLnhoPXRoaXMucGQ9dGhpcy5ZdT10aGlzLnhiPXRoaXMuS2I9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuWnM9MjAwO3RoaXMuR2Y9dGhpcy5TYz10aGlzLm1lPXRoaXMuRmY9dGhpcy5kZj0hMTt0aGlzLlVlPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTsKcmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLnBiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy52dSgpO2UudihrLkJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMueGI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucmIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5ZbygpLCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmInByZXJvbGwiPT1lLnBiJiZ0aGlzLm1oKCkmJnRoaXMubGgoKSYmLjM+TWF0aC5yYW5kb20oKT90aGlzLmdpKCk6KGY9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJnRoaXMuSS5pc0VuYWJsZWQ/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YiwKYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZGkoKSxuZXcgVCh0aGlzLGEsdGhpcy5waCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCkpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixjKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwKImFkIiwhMCk7dGhpcy5UZD10aGlzLlNiPXRoaXMucGQ9ITE7dGhpcy5jPWE7dGhpcy5qdSh0aGlzLmMpO3RoaXMuT2coYSk7dGhpcy51Yz10aGlzLkZnKGEpO3RoaXMuaHAoKX0sT2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSWQ9dGhpcy5LcShhKSksdGhpcy5PZyhhLnBhcmVudCkpfSxGZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRmcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy51cShhKSkpO3JldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7CjE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YywKYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlVjLmNvZGU6Yj09Ry5aZC5jb2RlP2UudihrLld2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuT2UoKSxiPT1HLk1mLmNvZGUmJmUudihrLnVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLllwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy53dSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLAp0aGlzLkJiLCEwKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay56dix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3Lk5mLmNvZGU6ZS52KGsuYXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuJGQuY29kZTplLnYoay5idyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LldkLmNvZGU6ZS52KGsudnMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsudnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsud3YsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLiRiKGEpO3RoaXMuUmEoKX0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5NZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yZT0hMTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTsKaWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmRmPSEwfWNhdGNoKGYpe319Y2F0Y2goZyl7fWIucng9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLktuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CmZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5GbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZGYmJmIubG9hZCgpO2lmKHRoaXMuJGgoYikpe3RoaXMuUmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuSW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5pcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuYy5vcmlnaW4ud2cody5XZCl9LGh1OmZ1bmN0aW9uKCl7dGhpcy5GZj0hMDt0aGlzLnZiPXRoaXMucGM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudmI9ITApO2UucWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ud2EmJmUuSm4odGhpcy5jLm9yaWdpbi53YSk7dGhpcy5SaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpOwp0aGlzLmIueWgoKTt0aGlzLmIucGYoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLnBmKCk7dGhpcy5nYj10aGlzLmIuTDt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLm9mKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy50YT10aGlzLmIuTDt0aGlzLmxpKCJ2cGFpZCIpO2lmKHRoaXMudmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5QYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwKIjEwMCUiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkwuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUub2YodGhpcy5HLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5HLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLk5xKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLApkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuTC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwKNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJgohdGhpcy5KZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuQmMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuZGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudWM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5LdihhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkx2KCksdGhpcy5iLmRjKCEwKSwhdGhpcy5TYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuU2I9e2VsOnRoaXMuRyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLlB2KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5kYyghMCksdGhpcy5UdigpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SdigpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5TdigpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF2KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09CmEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5ZYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5uZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkkuZWR8fHRoaXMuU2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuT3YoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJgp0aGlzLk12KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5TYyYmKHRoaXMuR2Y9ITEsdGhpcy5pYygpKSx0aGlzLk52KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy52Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5qZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmNnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5HLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sTXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxOdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucGM9ITF9LFB2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuJGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sT3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5TaCgpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpOwplLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxTdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxVdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sUXY6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0scmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUucWUoKTt0aGlzLkc9ITE7dGhpcy5SYShhKX19LEt2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Wdix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucmkoITApfSxGbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi52YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuR3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkkpKX0sJGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LEluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm1pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuRGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMubWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLm5pLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sbWk6ZnVuY3Rpb24oYSl7dGhpcy5aYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHx0aGlzLkRmKGEpfS5iaW5kKHRoaXMpLHRoaXMubG8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuJGgodGhpcy52aWRlbykmJiF0aGlzLktiJiYhdGhpcy5aYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuS2J8fCh0aGlzLktiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkkudmd8fHRoaXMuSS5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLkR2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIucGYoKTt0aGlzLkN2KCk7dGhpcy5saSgpO3RoaXMuZ2coKTt0aGlzLmIueWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuc2YoKX19LHNmOmZ1bmN0aW9uKCl7dGhpcy5rZHx8dGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYy5iaW5kKHRoaXMpKSk6TD1mdW5jdGlvbigpe3RoaXMuaGV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfS5iaW5kKHRoaXMpO3RoaXMueWUoKS5OaCh0aGlzKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkkubGImJiF0aGlzLktiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuem4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LENuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuSmcoYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS50dShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuQ24odGhpcy5jLlVkKTsKaWYoIXRoaXMucmUpaWYodGhpcy5yZT0hMCx0aGlzLlRkfHwoZS52KGsueHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMud2J8fHRoaXMuYy5zYyl7ZS5yYigibmV3U21hbGxBZElkIik7dGhpcy5yZisrO3RoaXMuWmI9dGhpcy5kZD0hMTt0cnl7dGhpcy5EZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5paSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkloKCk7dGhpcy5jLndiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnRoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sCkd2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy5DZihhKSl9LENmOmZ1bmN0aW9uKGEpe3RoaXMuWmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5JLlZvKCk7dGhpcy5jLm9yaWdpbi53Zyh3LldkKX0sbmk6ZnVuY3Rpb24oKXtpZih0aGlzLll1KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMuY3YoYSk7aWYoIXRoaXMuU2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5TYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7ZS52KGsub2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5TYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWgpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5IZHx8KHRoaXMuSGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMud2I/KHRoaXMuWmI9dGhpcy5kZD0hMSx0aGlzLkRkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmlpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5FZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sZWk6ZnVuY3Rpb24oKXt0aGlzLnhofHwodGhpcy54aD0hMCx0aGlzLnBkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sY3Y6ZnVuY3Rpb24oYSl7ZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmZpfHx0aGlzLktifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkkuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkJiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuZWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmVpKCl9LmJpbmQodGhpcykpLHRoaXMuS2J8fAp0aGlzLlNoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkkubGImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuSS5sYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLmFnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuZmk9YSl9LFJoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSx2dTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sU2g6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHd1OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLk9kKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkZmfHx0aGlzLkkubGIpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sUGI6ZnVuY3Rpb24oYSxiKXt0aGlzLkkubGImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5LYil7dGhpcy5VZSYmdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9CmMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5tZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLklkLmltcHJlc3Npb25zJiZlLkNyKGcudXJsLHRoaXMuSWQuaW1wcmVzc2lvbnMpP3RoaXMuTWUoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkFuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLklkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMucHAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLApiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkkuemEoYSksYyYmYi5FbihjKSxmfHwoZj10aGlzLnVnKSxlfHwoZT10aGlzLnVnKSx0aGlzLkduKGEpLHRoaXMuSS5MYShiLGZ1bmN0aW9uKCl7dGhpcy5IaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkhoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxHbjpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJvcGVuIn0sSGg6ZnVuY3Rpb24oYSl7dGhpcy5nY1thXT0iY2xvc2VkIn0saHA6ZnVuY3Rpb24oKXt0aGlzLmdjPXt9fSx5dTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHBwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT0KYn0pfSxEdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5pYygpOnRoaXMuYy5ZYiYmKGUudihrLm5nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5ZYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSwKQ3Y6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRWcoMCkpOwp2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkkuZmQmJihiPXRoaXMuSS5mZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5GYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEZiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LEZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxsaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5pZD10aGlzLm1wO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkxiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmkuYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmFpLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYWkuYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5KYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5adS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5RaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuRmQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5vZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuU2UoKSk7dGhpcy5HYigpfX0sR2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxpYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5HZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sYmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLnBjPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5wYz0hMSk6KGUubWEodGhpcy5HLCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5wYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxadTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsInVzZXIiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLnZiPyhlLm1hKHRoaXMuRywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuRywiY29udHJvbCIsIm11dGUiKSx0aGlzLnZiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay54ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuUGIoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnlmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxoYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5oYyk7dGhpcy5rZHx8dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LHNlOmZ1bmN0aW9uKCl7dGhpcy5taCgpJiZ0aGlzLmxoKCkmJih0aGlzLkkuWGN8fCJzcGllZ2VsLmRlIj09ZS5FYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJiJwcmVyb2xsIj09ZS5wYiYmdGhpcy5naSgpfHwodGhpcy5rZD0hMCx0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnBnKCkpfSxtaDpmdW5jdGlvbigpe3ZhciBhPWUubmQoKTtyZXR1cm4gdGhpcy5JLm9jJiYhZS5WYSgpJiYKKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLlhlfHwoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7cmV0dXJuKGF8fCF0aGlzLm1lJiZiLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YZX0sQXE6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsYj1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yi5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LGdpOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlhlPXRoaXMuU2M9dGhpcy5HZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuWmEoKSwhMCk7dGhpcy5tZT0hMDt2YXIgYT10aGlzLkFxKCksYT1lLmZnKGEsdGhpcy5JLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5OZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxwZzpmdW5jdGlvbihhKXt0aGlzLnl1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZyghMCl9LmJpbmQodGhpcyksdGhpcy5acyk6KHRoaXMuSmQ9ITAsdGhpcy5iLkNlKCksdGhpcy5iLlB0KCksdGhpcy5lYz0hMSxlLnYoay5scCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueWUoKS5JaCgpKX0seWU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhKCJtaW5WaXMiKTthJiYoZS5HZSh0aGlzLnZpZGVvLGEpP3RoaXMuS2goKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlliLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLndiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudWMmJjA8dGhpcy51Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuRW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuS2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLktnKCkpO3JldHVybiBhfSx1ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udT10aGlzLmFbNl07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5qcz1iO2IucHJvdG90eXBlPXttdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnU6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdwOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xcjp0aGlzLmpsKGEpfSxqbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua2w6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5qc3x8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm11KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRmE9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy50Yz10aGlzLnZjPSExO3RoaXMud2E9IiI7dGhpcy5FZj0hMTt0aGlzLlZnPSIiO2QmJmQuZW1wdHk/dGhpcy5lcygnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUudmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/Cm5ldyBBKHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5yZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuZHMuYmluZCh0aGlzKSx0aGlzLmFzLmJpbmQodGhpcykpfSxHZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLnBiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5GYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5wYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUucGJ8fHRoaXMuSHIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuRnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxkczpmdW5jdGlvbihhKXt0aGlzLnl0KGEpO3RyeXt0aGlzLkZhPWEucmVzcG9uc2VYTUwsdGhpcy5GYXx8KHRoaXMuRmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuR2coKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuWGgoKTt0aGlzLlZnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6CkcuTGZ9KSl9LGVzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkZhfHwodGhpcy5GYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody4kZCkpfXRoaXMuWT10aGlzLkdnKCk7dGhpcy52Yz10aGlzLnVmKCk7dGhpcy50Yz10aGlzLlhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkxjKCk6dGhpcy5zYSh0aGlzLlNhKHcuVWMse2Vycm9yOnRoaXMuRWY/Ry5aZDpHLkxmfSkpfSxhczpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LktmLHtkZXB0aDphfSkpfSxMYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkpyKCk/dGhpcy5UdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBnKCksaCx7QWRTeXN0ZW06dGhpcy50cSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy50digpJiZ0aGlzLiRlKHRoaXMub3AoKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/Cih0aGlzLnZjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LlRlKCl9LHRoOmZ1bmN0aW9uKCl7dGhpcy50Yz8odGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC50aCgpfSx0djpmdW5jdGlvbigpe3JldHVybiB0aGlzLlF1KCk/dGhpcy5QdSgpPyEwOigtMSE9dGhpcy5GYygpP3RoaXMuc2EodGhpcy5TYSh3LlZkKSk6dGhpcy5zYSh0aGlzLlNhKHcuSGYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlVjLEcuTWYpKSwhMSl9LCRlOmZ1bmN0aW9uKGEpe3RoaXMud2F8fCh0aGlzLndhPSIiKTthLlVkfHwoYS5VZD1bXSk7YS5VZC5wdXNoKHRoaXMuVmcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLndiPWEud2I/YS53Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMud2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5DZzt0aGlzLnBhcmVudC4kZShhKX0sb3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy53YXx8KHRoaXMud2E9IiIpO2EuZHVyYXRpb249dGhpcy5GYygpO2EuTz10aGlzLk1nKCk7YS5ZYj10aGlzLnZxKCk7YS55eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnNxKCk7YS5xZj10aGlzLkpxKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy53YXx8KHRoaXMud2E9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLndhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5DZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5WZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMud3EoKSk6Yi5QYS5jb25jYXQodGhpcy5GcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiRiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LiRiJiZ0aGlzLnBhcmVudC4kYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LCRiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LiRiKGEpfSx3ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxUdTpmdW5jdGlvbigpe3JldHVybiBhPGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sUHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkZjKCl9LHVmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LHl0OmZ1bmN0aW9uKGEpe3RoaXMud2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy53YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLndhPSJVTktOT1dOIn10cnl7dGhpcy5FZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxKcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuUGcoKS5sZW5ndGh9LFBnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZSh0aGlzLlUsIkFkU3lzdGVtIil9LFBlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmRoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm5iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5kaChhLnBhcmVudE5vZGUpOiExfSxGcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCk1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFR3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm5iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxzcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnJkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxGYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm5iKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEpxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUucXUoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx4ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJkKGEpOiIifSxyZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBUPWMuQW18fFQ7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuTGw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuVG09YjtiLnByb3RvdHlwZT17Y2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlRtfHxWYSxGYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9RmMuY2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5ZYj0iIjt0aGlzLkI9dGhpcy5zYz10aGlzLndiPSExO3RoaXMuRGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkVlPSIifWMuTWw9YjtiLnByb3RvdHlwZT17aXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sRHE6ZnVuY3Rpb24oKXtpZighdGhpcy5EZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkZhKXt2YXIgYT10aGlzLm9yaWdpbi5GYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkRlPWFbY10pfXJldHVybiB0aGlzLkRlfSxLZzpmdW5jdGlvbigpe2lmKHRoaXMuRWUpcmV0dXJuIHRoaXMuRWU7dmFyIGE9IiI7KGE9dGhpcy5EcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksCmE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkVlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5NbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzJdO3RoaXMuUm49dGhpcy5hWzZdO3RoaXMuWXM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMucHI9YjtiLnByb3RvdHlwZT17bmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUm46dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLllzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucHJ8fApXYSxHYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5uaig0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnR3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sdXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuYm49dGhpcy5hWzNdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy4kbD1iO2IucHJvdG90eXBlPXthbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm46dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy4kbHx8WGEsSGM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkFqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Banx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnZ0PXRoaXMuYVs3XTt0aGlzLnhvPXRoaXMuYVsyXTt0aGlzLmJxPXRoaXMuYVs0XTt0aGlzLmttPXRoaXMuYVsxXTt0aGlzLkdrPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzVdfWMucW49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZ0OnRoaXMud28oYSl9LHdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnE6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMucW58fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1JYy51dCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5SZD1bXTt0aGlzLkdoPVtdO3RoaXMuVmU9W107dGhpcy5Gdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMudnc9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5KaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLm54PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLkx0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkR0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGR0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sCnRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5WZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlZlW2JdO2MudHlwZT09PWEmJmMuS28odGhpcy54cShhKSl9fSx4cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnt3eDohMCx2eDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntqeDoidmlkZW8iLHp4OiJqc0N1c3RvbSIsQXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxCeDoxLFV3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sCmFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZC5sZW5ndGg7YisrKWlmKHRoaXMuUmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5SZFtiXS5kdDtyZXR1cm4iIn0sTHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkdoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1xKGIpLHZlbmRvcjpifSk7dGhpcy51dSgpfSxEdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuRnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLEtvOmIsdHg6ITF9KX0sdXU6ZnVuY3Rpb24oKXt0aGlzLkdoLm1hcChmdW5jdGlvbihhKXthLkZyfHwKKGEubXgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnh4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JaT10aGlzLmFbNF07dGhpcy5ydD10aGlzLmFbNl07dGhpcy5Ubj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5Raz1iO2IucHJvdG90eXBlPXtIaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSWk6dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ0OnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuVG46dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJzOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHc6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmN0OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuUWt8fFphLEpjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkhpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMua2I9YS5IZygpO3RoaXMuTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkwuaWQ9ZS5hYSgxMCk7CnRoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5lZz0hMTt0aGlzLldiPVtdfWMucGo9YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMuZnIoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5lZz0hMH0saWk6ZnVuY3Rpb24oKXt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLkJjLHRoaXMuZi5zKCkpfSxQdDpmdW5jdGlvbigpe3RoaXMuZWd8fCh0aGlzLmYucGxheSgpLGUudihrLmpkLHRoaXMuZi5zKCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5MLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkwuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkwuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuTC5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5mLk9jJiZ0aGlzLmYuT2MoKT90aGlzLmYuSGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5rcSh0aGlzLmtiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkNlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5PYygpPyh0aGlzLkwuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkwuc3R5bGUudG9wPSIwcHgiKToodGhpcy5MLnN0eWxlLmxlZnQ9CmIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLldiLmxlbmd0aDthKyspdGhpcy5XYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRmKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGNnOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLldiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5XYi5wdXNoKGEpfSxDZTpmdW5jdGlvbigpe3RoaXMuTCYmdGhpcy5MLnBhcmVudE5vZGUmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkwpOwp0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5wanx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5hYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEw9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibz10aGlzLmFbNl07dGhpcy5acj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs5XX1jLnhtPWI7Yi5wcm90b3R5cGU9CnthbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYm86dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy54bXx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuYW8oNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMuc2coKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8Cih0aGlzLmlkPWIpfSxzZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8KITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5WYj10aGlzLlZifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy5aZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsCmIpe3RoaXMuaXEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnhmPSEwO3RoaXMuWmcmJnRoaXMubWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5IYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLlpnPSEwO3RoaXMubWcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxtZzpmdW5jdGlvbigpe2lmKCF0aGlzLlZiKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMueGYmJnRoaXMuV2YmJiF0aGlzLllmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE5nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk5nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLlJ3fXRoaXMueWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LFZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmh4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSxHcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxpcTpmdW5jdGlvbihiLGEpe3RoaXMuVmI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5WYnx8MzAyPT10aGlzLlZiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlZiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5GZSgpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sR3I6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuam4uZ24/d2luZG93Lk9PLlFsLmpuLmduLlB3KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnplKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbM107dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzVdO3RoaXMubWs9dGhpcy5hWzJdO3RoaXMucG49dGhpcy5hWzRdO3RoaXMuT2k9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX0KYy54bj1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZXA6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXM6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1rOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wbjp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy54bnx8Z2IsTGM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmNwKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5RZygpfSxRZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5CaCgpfSxCaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYWp8fGhiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxqZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmpnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuamcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEVoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5FZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkopKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5qcXx8KHRoaXMuanE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5FaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixVPW5ldyBqYihyKTtVLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy51bT1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLnVtfHxrYixNYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxPYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZG18fFY7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guYWQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuQ3MoYSl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5IKCl9LmJpbmQodGhpcykpO3guVXEoKX0sQ3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgVz1jLmNtfHxXOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS5xcChiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFcoZCx0aGlzLkopO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnlkfHwodGhpcy55ZD1bXSksdGhpcy55ZC5wdXNoKGJbYV0pLGQ9bmV3IFYoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFcoZCx0aGlzLkopLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuS2N8fCh0aGlzLktjPVtdKSx0aGlzLktjLnB1c2goYiksdGhpcy5PdCgpJiYodGhpcy5nZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxVcTpmdW5jdGlvbigpe2lmKHRoaXMuS2MpZm9yKHZhciBiPTA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5VdShiKX19KX0pKGMpO3ZhciBsYj1jLmVtfHxsYix4PW5ldyBsYihyKTtjYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlqPXRoaXMuYVsxMF07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Paj10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5QcD10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5TbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzddO3RoaXMuTHU9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQ2k9YjtiLnByb3RvdHlwZT17aGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pajp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUm86dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV3M6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cjp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2w6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QbTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5DaXx8bWIsTmM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaGooNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkgoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5IKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5ZaXx8b2I7KGZ1bmN0aW9uKGMpe2MuWmk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkopKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5aaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVsPXRoaXMuYVs2XTt0aGlzLk1pPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVszXTt0aGlzLkpvPXRoaXMuYVs3XTt0aGlzLm93PQp0aGlzLmFbN107dGhpcy5Ybj10aGlzLmFbOV07dGhpcy5JcD10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNV07dGhpcy5zbj10aGlzLmFbOF07dGhpcy5vbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLk5wPWI7Yi5wcm90b3R5cGU9e0RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FbDp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTWk6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSm86dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm93OnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybjp0aGlzLkhwKGEpfSxIcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFrOnRoaXMucm4oYSl9LApybjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc246dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm9tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5OcHx8cmIsT2M9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuRGwoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT0KYik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLkN0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEN0OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LCRnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuc2x8fHNiOyhmdW5jdGlvbihjKXtjLnJsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5zaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5zaSYmKHRoaXMuSCgpLHRoaXMuc2k9ITAsdGhpcy5vYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCwKZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5ybHx8dGI7KGZ1bmN0aW9uKGMpe2MudGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSikpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy50bHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3I9dGhpcy5hWzVdO3RoaXMuUHE9dGhpcy5hWzEwXTsKdGhpcy5sdT10aGlzLmFbNF07dGhpcy5ubz10aGlzLmFbMTBdO3RoaXMuRXM9dGhpcy5hWzVdO3RoaXMud209dGhpcy5hWzldO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuSmw9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzRdO3RoaXMub2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBxOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sdTp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm86dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fczp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud206dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WbTp0aGlzLklsKGEpfSwKSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLlNrfHx2YixQYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5qcig0KTsoZnVuY3Rpb24oYyl7Yy5KbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgd2I9Yy5KbXx8d2I7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sYWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEF0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuQXQodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5hYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMud2Mpe3RoaXMuSCgpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7CmVsc2V7dGhpcy5IKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5JbXx8eGI7KGZ1bmN0aW9uKGMpe2MuS209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkttfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy56cz10aGlzLmFbNl07dGhpcy5rdj10aGlzLmFbM107dGhpcy5TbT10aGlzLmFbMV07dGhpcy5Vcz10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbM107dGhpcy5qbz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLldpPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hdDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmw6dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpzOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rdjp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU206dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVzOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLlNpOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Nbjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuam86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLldpfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy4kcyg0KTsoZnVuY3Rpb24oYyl7Yy5XbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5hZj0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmt0KCl9LmJpbmQodGhpcyksNTAwKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5hZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx4dTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLldsfHxCYjsoZnVuY3Rpb24oYyl7Yy5WbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmM9MH0sZzpmdW5jdGlvbigpe3RoaXMubnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jfHwodGhpcy5uYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMubnM/KHRoaXMubmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnh1KCksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQ2I9Yy5WbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkopKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLlhsfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGo9dGhpcy5hWzFdO3RoaXMueGo9dGhpcy5hWzddO3RoaXMuZ3E9dGhpcy5hWzZdOwp0aGlzLnBxPXRoaXMuYVs5XTt0aGlzLml2PXRoaXMuYVs2XTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLmFyPXRoaXMuYVs5XTt0aGlzLlVyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLkh2PWI7Yi5wcm90b3R5cGU9e0dqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Iajp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ncTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHE6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLml2OnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pazp0aGlzLiRxKGEpfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYXI6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLkh2fHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5Haig0KTsoZnVuY3Rpb24oYyl7Yy5VbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlVsfHxHYjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmpwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuRGIoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlhyKCk6dGhpcy5sZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGpwOmZ1bmN0aW9uKCl7dGhpcy5VZigpfHx0aGlzLm0oITApfSxYcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGIoKTshYi5xYSYmCmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMDApfSxEYjpmdW5jdGlvbigpe2lmKCF0aGlzLndoKWZvcih2YXIgYj1jLlZjLkRiKCksYT10aGlzLmdldFBsYXllcigpLkphKCkuaWQsZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0uaWQ9PQphJiYodGhpcy53aD1iW2VdKTtyZXR1cm4gdGhpcy53aH0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuRGIoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5UbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgSGIoYix0aGlzLkopKS5nKCkpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuRGIoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLlhvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuRGI9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksYVtjXSYmYVtjXS5wYXJlbnRFbGVtZW50JiZhW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiYKYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5taj10aGlzLmFbNV07dGhpcy5IdT10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbNF07dGhpcy5Jcz10aGlzLmFbN107dGhpcy52bz10aGlzLmFbM107dGhpcy5Zaz10aGlzLmFbNV07dGhpcy5HcD10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbOF07dGhpcy5mbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX0KYy5ybz1iO2IucHJvdG90eXBlPXtsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5HdShhKX0sR3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IdTp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG46dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLklzOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bzp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5jcjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJvfHxLYixTYz1uZXcgS2IoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MubGooNCk7KGZ1bmN0aW9uKGMpe2MuVms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxneDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuRWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuVmt8fFk7KGZ1bmN0aW9uKGMpe2MuVWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLm94KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuVWt8fFo7KGZ1bmN0aW9uKGMpe2MuV2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5uYT90aGlzLmdmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3M9dGhpcy5hWzddO3RoaXMuS3A9dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzFdO3RoaXMuSGw9dGhpcy5hWzFdO3RoaXMuaj0KdGhpcy5hWzhdfWMuVnA9YjtiLnByb3RvdHlwZT17RnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdzOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRWk6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpqOnRoaXMuR2woYSl9LEdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuVnB8fE5iLFRjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLkZzKDQpOyhmdW5jdGlvbihjKXtjLlFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LFV0OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxseDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlFqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Qaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Qanx8UGI7KGZ1bmN0aW9uKGMpe2MuUmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlJqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzRdO3RoaXMub3I9CnRoaXMuYVs1XTt0aGlzLlVwPXRoaXMuYVsxMF07dGhpcy5lcT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnFsPWI7Yi5wcm90b3R5cGU9e3ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy53bjp0aGlzLnJ2KGEpfSxydjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3Y6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1tOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVXA6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMucWx8fFNiLFVjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1VYy52big0KTsoZnVuY3Rpb24oYyl7Yy5ZbT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxQZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sQnQ6ZnVuY3Rpb24oKXt0aGlzLlRjPQohMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlRjfHwodGhpcy5UYz0hMCx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlRjJiYodGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlRjPSExKSx0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTsKdmFyIFRiPWMuWW18fFRiOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJgpiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlhiKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5GaC5iaW5kKHRoaXMpLDEwKX0sWGI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSx0aGlzLnluPSEwLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy55bnx8dGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sUWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuWGIod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7CnRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5RZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZoKCk7dGhpcy5RZigpO3RoaXMuRXQoKX0sRXQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlhiKGIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLnp0P3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLnp0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuWGIoYikpfX0pfSkoYyk7dmFyIFViPQpjLlhtfHxVYjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLkJ0KCksYj1uZXcgVWIoYix0aGlzLkopLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5abXx8VmIsV2I9bmV3IFZiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbT10aGlzLmFbMTBdO3RoaXMuUGs9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy53cD1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5IbTp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGI9Yy53cHx8WGIsVmM9bmV3IFhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuR20oNCk7KGZ1bmN0aW9uKGMpe2MucW09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy56aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5xcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVXQ6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/CiExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFzfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMuemgmJih0aGlzLnpoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy5xbXx8UDsoZnVuY3Rpb24oYyl7Yy5wbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnZlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLmZ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT0KYSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFE9Yy5wbXx8UTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYik7dGhpcy5XYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBQKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUShiLHRoaXMuSiksYi5nKCkpKTt0aGlzLmdmKCk7dGhpcy5UKCl9fSl9KShjKTt2YXIgWWI9Yy5ybXx8WWIsWmI9bmV3IFliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnN3PXRoaXMuYVs3XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLnF2PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlJrPWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdzp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5wdihhKX0scHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnF2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Sa3x8CiRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnJ3KDQpOyhmdW5jdGlvbihjKXtjLklrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuSWt8fAphYTsoZnVuY3Rpb24oYyl7Yy5Iaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuQ2E9dGhpcy5jZD0hMTt0aGlzLkRoPWUuTWIoMTApO3RoaXMuZmgoKX0sZmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnRiKCksITA7dGhpcy5XZysrO2lmKDEwPHRoaXMuV2cpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7CmVsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLkhrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Kaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBiYShiLHRoaXMuSiksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuSmt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcz10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbN107dGhpcy5obz10aGlzLmFbNV07dGhpcy4kdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs3XX1jLktyPWI7Yi5wcm90b3R5cGU9e1BzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Rczp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuT3M6dGhpcy5mbyhhKX0sZm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhvOnRoaXMuWnYoYSl9LFp2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLktyfHxjYyxYYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Qcyg0KTsoZnVuY3Rpb24oYyl7Yy5Kaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpOwp2YXIgZGM9Yy5Kanx8ZGM7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMua2coKX0sa2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkgoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLklqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7CihuZXcgZWMoYix0aGlzLkopKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLktqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3A9dGhpcy5hWzNdO3RoaXMuaXc9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzEwXTt0aGlzLmd2PXRoaXMuYVsyXTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLmhyPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuRmw9YjtiLnByb3RvdHlwZT17QnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNwOnRoaXMuaHcoYSl9LGh3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pdzp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnA6dGhpcy5mdihhKX0sCmZ2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ndjp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktpOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ocjp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXY6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuRmx8fGhjLFljPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkJwKDQpOyhmdW5jdGlvbihjKXtjLnZpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy52aXx8aWM7KGZ1bmN0aW9uKGMpe2MudWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CnRoaXMub2UoKTt0aGlzLmhnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJgpiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LERhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9LG9lOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIGpjPWMudWl8fGpjOyhmdW5jdGlvbihjKXtjLndpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSikpLmcoKSl9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMud2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdz10aGlzLmFbMl07dGhpcy5haz10aGlzLmFbNV07dGhpcy5Naj10aGlzLmFbOF07dGhpcy54dD10aGlzLmFbNV07dGhpcy50aj10aGlzLmFbOV07dGhpcy52aj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e3B3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xdzp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6CnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Najp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHQ6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRqOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMucG98fG1jLFpjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLnB3KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmhoPXRoaXMuamg9dGhpcy5paD0hMTt0aGlzLkFkPVtdO3RoaXMuZmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PQp0eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLk9sPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSHEoYSk6W10sYjt0aGlzLmpoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmloPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkxoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5mZil7aWYodGhpcy5oaClicmVhaztiPXRoaXMuZmZbY107dGhpcy5BZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLkxoKGIpKX19LEFmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YKdD8hMDohMX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuZmZbY10sdGhpcy5BZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxMaDpmdW5jdGlvbihhKXt0aGlzLkFmKGEpJiZhLmcoKX0senU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLmloKWZvcih0aGlzLmhoPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLlFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uUWIpfX19KShjKTt2YXIgbmM9Yy5PbHx8bmMsTj1uZXcgbmM7Ti5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzEwXTt0aGlzLm1tPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU2o9YjtiLnByb3RvdHlwZT17Tm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuUG46dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5Tanx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuTm4oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrCjEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkVjKGsudXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkVjKGsud3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0oua2EoKTtKLmFoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5rYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sCiExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihKLmFoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Si5rYSgpO3ZhciBiZD1hZChmdW5jdGlvbigpe2UuQmcod2luZG93LEoueHIoKSx7aWQ6YmR9KX0sNTAwKSxqYT1lLmFhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFwPXRoaXMuYVszXTt0aGlzLk1wPXRoaXMuYVs5XTt0aGlzLmd3PXRoaXMuYVs4XTt0aGlzLlpxPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzRdfWMuU3A9YjtiLnByb3RvdHlwZT17enA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpxOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlNwfHxwYyxjZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1jZC56cCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuQWg9dGhpcy5jb25mPXRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkNoPSExO3RoaXMuY2Y9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMueGk9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oYSl7dGhpcy5BaD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFh0OmZ1bmN0aW9uKGEpe3RoaXMub2I9CmF9LFd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LFBjOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMueXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnhhLAp0aGlzLm9iLmVmLGZ1bmN0aW9uKCl7dGhpcy5QYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMub2IuRGMpO2Vsc2UgaWYodGhpcy5XcSgpKXRoaXMuUXQoZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5CYyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuQnUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5yYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5WdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubXMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9CnRoaXMucGxheWVyLktlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLk5lKGEsYyxmKTt0aGlzLnBsYXllci5OaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0scHU6ZnVuY3Rpb24oKXtlLnJiKCJwcmVyb2xsIik7ZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnhnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsCnRoaXMucGxheWVyLnMoKSkpfSxvdTpmdW5jdGlvbihhKXtpZighdGhpcy5BaCl7ZS5sZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuYnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLklhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMueGcoYykpP3RoaXMuUGMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx4ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sSHQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm91LmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5OYSgpfSxHZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5sZigibWlkcm9sbCIpO2lmKCF0aGlzLnFoKXt0aGlzLnFoPSEwO3ZhciBiPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLlBjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sR3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5hdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnB1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuR3QoKTt0aGlzLkh0KCl9LEl0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LFdxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LFF0OmZ1bmN0aW9uKGEpe3RoaXMuQ2g9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5vdC5iaW5kKHRoaXMpKX0sb3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkNoKCl9LG1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj0KdGhpcy5jZltjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy54aXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdT10aGlzLmFbN107dGhpcy5ibT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy4kbT1iO2IucHJvdG90eXBlPXtJdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSnU6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy4kbXx8cWMsZGQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXUoNCl9KS5jYWxsKFZvSmFpdnV4SXViYWhwaGksClZvSmFpdnV4SXViYWhwaGkpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.9.51.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.51.9.176.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 01 Nov 2019 09:19:38 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
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame 8134
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019102401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-36/html/container.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
3516
date
Fri, 01 Nov 2019 08:46:32 GMT
expires
Sat, 31 Oct 2020 08:46:32 GMT
last-modified
Wed, 16 Oct 2019 15:42:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
1986
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
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_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

status
200
date
Fri, 01 Nov 2019 09:33:32 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame BA91
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_rendering_2019102401.js?21065059
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-36/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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
3516
date
Fri, 01 Nov 2019 04:46:25 GMT
expires
Sat, 31 Oct 2020 04:46:25 GMT
last-modified
Wed, 16 Oct 2019 15:42:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
16393
alt-svc
quic=":443"; ma=2592000; v="46,43",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 1007
78 KB
29 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_modern_2019102401.js?21065059
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c0b74996deebf9409b61191121b6d7a8156ba2cfb1db0b3baa429d0d73f1d3b8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572456690621290"
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-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
29301
x-xss-protection
0
expires
Fri, 01 Nov 2019 09:19:38 GMT
4766719661
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
251 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4766719661
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.157.25.58 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-25-58.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:39 GMT
x-powered-by
Express
etag
W/"2f-ezy4lOIAuO+rt9Cr2EtybdwkRU0"
x-key
/bl/4444/4766719661
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
47
activeview
pagead2.googlesyndication.com/pcs/ Frame 64C1
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuBEoaSARnQFU46FvpJ_KnL9Oh_1bTCyEyrVw2eQpLt5CJ2basFUjXaMR2LGYuYGO28DYJD393ULavlwYleHe1tI7DvgYa6SP0hykbDTgs&sig=Cg0ArKJSzGUEAjHgr444EAE&adk=3040188762&tt=-1&bs=1585%2C1185&mtos=1055,1055,1055,1055,1055&tos=1055,0,0,0,0&p=121,429,211,1157&mcvt=1055&rs=3&ht=0&tfs=1217&tls=2272&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=1022&niot_cbk=1027&md=2&lm=2&rst=1572599977475&rpt=141&isd=0&msd=0&oseid=3&xdi=0&ps=1618%2C5896&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-23-22-14-126-20-0-0-0&tvt=2264&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191030
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 - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:38 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
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
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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 1007
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssL_DbtI9m0k4zFsFbegC83HUxIQzSR2IfX9lppeK7IXLiftMJh6xgq6g5cvteXomEPL6h8WyTKHD1BaBlqSD2aJ6MGq2zTLV4uWzwoan8&sig=Cg0ArKJSzHq86SMPG5PlEAE&adk=946476008&tt=-1&bs=1585%2C1185&mtos=0,1030,1030,1030,1030&tos=0,1030,0,0,0&p=121,1318,721,1618&mcvt=1030&rs=3&ht=0&tfs=1548&tls=2578&mc=0.89&lte=0.89&bas=0&bac=0&met=no&avms=nio&niot_obs=1272&niot_cbk=1285&md=2&lm=2&rst=1572599977725&rpt=204&isd=0&msd=0&oseid=3&xdi=0&ps=1618%2C5896&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-26-25-14-147-23-0-0-0&tvt=2570&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191030
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 - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:39 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
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
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9OGHwAA/k0FMQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A25A00AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3yA15A55A33A4yA2mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx5A0wAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A35A5xAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13Ay1A55A53A51A53ALlnFETkzFPPAAAtGA5BAHl5/ARksFAQtjFBQ5rYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:38 GMT
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
28 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:39 GMT
Content-Encoding
gzip
Age
420
X-Cache
HIT
Connection
keep-alive
Content-Length
10727
x-amz-id-2
H3hiFpPQwhEr6WsxB5NI4Ks7EFNhR8e4AJkFYmlaPm0CA8SXAYYjgz5mlgqfViLhAJES1cBa4Uo=
X-Served-By
cache-hhn4021-HHN
Last-Modified
Thu, 17 Oct 2019 18:13:36 GMT
Server
AmazonS3
X-Timer
S1572599980.818732,VS0,VE0
ETag
"084deea6f314d94436d69a233e4af5e3"
x-amz-request-id
55F7D1EC2D314E0D
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
744
4765983595
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
252 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4765983595
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.157.25.58 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-25-58.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:40 GMT
x-powered-by
Express
etag
W/"2f-ezy4lOIAuO+rt9Cr2EtybdwkRU0"
x-key
/bl/4444/4765983595
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
47
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 7691
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.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_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=124273
Expires
Sat, 02 Nov 2019 19:50:53 GMT
Date
Fri, 01 Nov 2019 09:19:40 GMT
Connection
keep-alive
Vary
Accept-Encoding
usync.html
eus.rubiconproject.com/ Frame 99BC
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.78.125 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-78-125.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
khaos=K2FXF8LR-D-IN98; rsid=1|AIfsdBUH+v3fWCPuzNowDE/csJlhKKCtlShoIonwVQ9xrYWTPwTlQcGeCrTlkuDKR3OktVOrDQv9SSiUXyP4Wwn1rWxbuVEZ+xAvac7RQXIhonWtCKFXU67jTKLZMTCUbujKyH9hUy4=; ses57=; vis57=156224^1; audit=1|hLZGFuTafB1UchKohCR9v7P28YeSsEsB416vRKYnUza3uBV96OmTSUaXUF0Dqvo9lVWZSWjC2ydZzHzbJL9ABaZr5ZVxLWDe
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Tue, 29 Oct 2019 21:13:31 GMT
Content-Encoding
gzip
Content-Length
7570
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=38157
Expires
Fri, 01 Nov 2019 19:55:38 GMT
Date
Fri, 01 Nov 2019 09:19:41 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 51BF
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.108 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Fri, 01 Nov 2019 09:19:40 GMT
Age
7515466
Connection
keep-alive
X-Served-By
cache-jfk8124-JFK, cache-fra19139-FRA
X-Cache
HIT, HIT
X-Cache-Hits
1, 1383285
X-Timer
S1572599981.982270,VS0,VE0
Vary
Accept-Encoding
data
lb14.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb14.s400.meetrics.net/data?/dm9OHJOBAUkzFkBPGYAAAAAAABUXAAPBAAFAAUXAT9HWAPAAAJPAWEAB9HWAZAAAOA55A55A85B55A58E55A55AEAx0A5yAr9HWAPHEAJPAWEAH9HWASksFmGjAAAAAAAAAAAAEAAAUXAAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFJAylFj0FhuFnsFlBFEAu1FssFEAu1FssFzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAA9HWAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAz2AvoE0tFsvBjvFu0FhpFulFyuBo0FtsFPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFsQO9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:41 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 01-Nov-19 09:19:40 GMT
tag
a.teads.tv/page/68592/ Frame 2EBB
1 KB
827 B
Script
General
Full URL
https://a.teads.tv/page/68592/tag
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
551
expires
Fri, 01 Nov 2019 10:19:46 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1572599986491&__it=-60&__ic=727391&__iq=83df30ad54b53dcc566da371aa312ad5&__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

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:46 GMT
Last-Modified
Sat, 24 Oct 2009 09:18:56 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
Fri, 26 Oct 2012 09:18:56 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
708 KB
185 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/page/68592/tag
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
09442ae0dd813584346fc99901d04ac2d8fce26de34d49ba40f731d18494cbe4

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
content-encoding
gzip
last-modified
Tue, 29 Oct 2019 09:07:07 GMT
x-amz-request-id
CC22B8A8C7F73ACC
etag
"2573c2d78de44d3ac436039dd0438ee8"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
d
accept-ranges
bytes
content-length
188203
x-amz-id-2
vKWfp6QQ8X72dbsrGAOA/eNtE6ZzWCgURnkBxVLm3HLSLDxMTv+CnawfV5BBmd0wn2+6G+OVBxI=
expires
Fri, 01 Nov 2019 09:29:46 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame 1948
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:293::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
kGI/LkmsIcd2daPyZ44T91Tgh3nqFBaPCP2I5Rt/ZLlg5M5DrVepYy/Ac/ZfkFjnOAPn7svobKA=
x-amz-request-id
B87A212102411FA1
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Fri, 01 Nov 2019 09:24:46 GMT
Date
Fri, 01 Nov 2019 09:19:46 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame 4537
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:293::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
kGI/LkmsIcd2daPyZ44T91Tgh3nqFBaPCP2I5Rt/ZLlg5M5DrVepYy/Ac/ZfkFjnOAPn7svobKA=
x-amz-request-id
B87A212102411FA1
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Fri, 01 Nov 2019 09:24:46 GMT
Date
Fri, 01 Nov 2019 09:19:46 GMT
Connection
keep-alive
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=96537052&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:46 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986682&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=96537052&cs_ucfr=1
Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:46 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1572599986679&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=147
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1572599986680&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=147
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=49068366&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:46 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1572599986697&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=49068366&cs_ucfr=1
Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:46 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1572599986695&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=147
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1572599986695&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=147
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=b0e6cb8f-7059-4227-8ffd-1040d2215c8e&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=125
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Fri, 01 Nov 2019 09:19:46 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=b0e6cb8f-7059-4227-8ffd-1040d2215c8e&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=125
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Fri, 01 Nov 2019 09:19:46 GMT
/
track.adform.net/Serving/Cookie/
73 B
448 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.252 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
s1.adform.net
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
826 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.246.21.201 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-246-21-201.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
f1d6b82582daaa011bffc148e2bf62f621380195161a6fe56804e1b6e686fad6

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=120
content-encoding
gzip
content-length
714
content-type
application/javascript
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
18 KB
18 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json
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
7699c7da63856c957040272eea2918820981cf95ba9ac1fba99cdd60236dc84c

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Fri, 01 Nov 2019 09:19:46 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
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/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 3ccfbae98f5816b531634c1e82e45259.cloudfront.net (CloudFront), 1.1 varnish
age
1545150
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-fra19173-FRA
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1572599987.847942,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
Vs4TubaGEnCgigh3kN5-OJytJd-a8QzTxQCNFZg0hh5KVFK_O_tI7g==
x-cache-hits
1182605
oppsula.js
vidstat.taboola.com/oppsula/1.3.6/
15 KB
5 KB
Script
General
Full URL
https://vidstat.taboola.com/oppsula/1.3.6/oppsula.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 f96185b1d69d6f85635bc2b5554da639.cloudfront.net (CloudFront), 1.1 varnish
age
1481008
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5174
x-served-by
cache-fra19173-FRA
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1572599987.848904,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
uhaJsUkg4hXF1IiWZjxakv-aTXNBKcYYS7Jfn2_5QjDWGhm5qnKWew==
x-cache-hits
1114617
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.2/
678 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.2/OvaMediaPlayer.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
306bd86c2092aa28d65dd56da1d135b947fd092bea0ee6442a9857e60c15e0a1

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 6e8dd39e00d9a5c1a31d69ffa2821a5e.cloudfront.net (CloudFront), 1.1 varnish
age
333974
x-amz-meta-mtime
1572251674
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
184270
x-served-by
cache-fra19173-FRA
last-modified
Mon, 28 Oct 2019 08:34:35 GMT
server
AmazonS3
x-timer
S1572599987.865800,VS0,VE0
etag
"982edd685a72978d76bed56ea79ec0fd"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA54
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
FMZ-pQYoqNgwwYaYild4r0LuU20AWKeKfxANqMMdSnLULYLghdW2zw==
x-cache-hits
645470
sync
match.taboola.com/ Frame C774
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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.13.12
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 varnish
x-served-by
cache-hhn4075-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1572599987.868933,VS0,VE9
st
convammp.taboola.com/
0
88 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7jusCFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHcLY7CaczYo3XAx2u8FwMxssFsPZbjkcbTZD4BDGZjfhbFa84WKw2w2Gm9VyNVxORrPBYDGFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3wxeaTofPda_X_X53ndPnsItcft3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLLwcAAACABwClwn6IH0AAgAgAAAAACQAAAACKgIp_C4ELAAAAAAyAAqwfDQAKDgRxOVw3h_PzDwCAhwAQAIABBRKAAZymEoCKnIMTAAAAAAAAAACW_____xgAPeIzGYAMpcEegAcfgAeigsoiRgAAAAC50tlzR5M6obKoAgAgSLcCuAIACHAzGar6DQMAACAYW6CHxe83O-wav9tlAAAAAAAAAABm_2f_aEJKPkJpQLQt4Gq_gAAAa7-AAABs6gYA8CYAF3QErRgMVmcQk81oN5kdAAAAwN3___-_HohMJi6bZ7lczUbOzXDkWkx2G99wY3PuJrbVYuTxHtgR6YY44vNk34iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3HOAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkyOfLvlajFZKzyzlVs0chjXEtPEuZaYDMPFaOZyuEabtej1MZ0mrt3KMtyiYADVXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22VcmE5fNs1yuZiPnZjhyLSa7jW-4sTl3E9tqMfL4myPfbrlaTNYKz2zlFo0cxrXENHGuJSbDcDGauRyu0WYten1Mp4lrt7IM943VbrJaLpe72b6x2k1Wy-VyN9t36Azf1edsVN60Co_OdFstZqaZ06BwGSzejWp1HH8mB2u0bHTqnM2LRuL3-_1-v9_v9_vFCa9B4TkYFLFEcLpIJ6KX8XQRSyRPi3SiMblGk91mYpnMBjPHxDLZTUYuw3IxnK0mM5dzMRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPz7EcDWXLAZzyWI3VyxWqwQAAAAAAAAAsIQ58yYAAAAAp4EsFoPJYrkAEGKsuwSfUiGPTuBvxY0fQ8zp8ne5LG_N2-LWOX0OKwNI7BQA!&cmcv=&pix=31589837&cb=1572599986831&uv=231421&tms=1572599986831&abt=dppf1_vA!expl_vC!qp2_vE!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1572599975836.658!ts:1572599986831&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599987.868388,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN
st
convammp.taboola.com/
0
78 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7jusCFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHcLY7CaczYo3XAx2u8FwMxssFsPZbjkcbTZD4BDGZjfhbFa84WKw2w2Gm9VyNVxORrPBYDGFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3wxeaTofPda_X_X53ndPnsItcft3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLLwcAAACABwClwn6IH0AAgAgAAAAACQAAAACKgIp_C4ELAAAAAAyAAqwfDQAKDgRxOVw3h_PzDwCAhwAQAIABBRKAAZymEoCKnIMTAAAAAAAAAACW_____xgAPeIzGYAMpcEegAcfgAeigsoiRgAAAAC50tlzR5M6obKoAgAgSLcCuAIACHAzGar6DQMAACAYW6CHxe83O-wav9tlAAAAAAAAAABm_2f_aEJKPkJpQLQt4Gq_gAAAa7-AAABs6gYA8CYAF3QErRgMVmcQk81oN5kdAAAAwN3___-_HohMJi6bZ7lczUbOzXDkWkx2G99wY3PuJrbVYuTxHtgR6YY44vNk34iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3HOAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkyOfLvlajFZKzyzlVs0chjXEtPEuZaYDMPFaOZyuEabtej1MZ0mrt3KMtyiYADVXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22VcmE5fNs1yuZiPnZjhyLSa7jW-4sTl3E9tqMfL4myPfbrlaTNYKz2zlFo0cxrXENHGuJSbDcDGauRyu0WYten1Mp4lrt7IM943VbrJaLpe72b6x2k1Wy-VyN9t36Azf1edsVN60Co_OdFstZqaZ06BwGSzejWp1HH8mB2u0bHTqnM2LRuL3-_1-v9_v9_vFCa9B4TkYFLFEcLpIJ6KX8XQRSyRPi3SiMblGk91mYpnMBjPHxDLZTUYuw3IxnK0mM5dzMRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPz7EcDWXLAZzyWI3VyxWqwQAAAAAAAAAsIQ58yYAAAAAp4EsFoPJYrkAEGKsuwSfUiGPTuBvxY0fQ8zp8ne5LG_N2-LWOX0OKwNI7BQA!&cmcv=&pix=&cb=1572599986852&uv=231421&tms=1572599986852&abt=dppf1_vA!expl_vC!qp2_vE!ufm_vA&ft=0&unm=FEED_MANAGER
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:47 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599987.868518,VS0,VE132
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN
ngx_pagespeed_beacon
www.giga.de/
0
73 B
XHR
General
Full URL
https://www.giga.de/ngx_pagespeed_beacon?url=http%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

status
204
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache
server
nginx
iframe
sync.teads.tv/ Frame 431E
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=76332&userId=b0e6cb8f-7059-4227-8ffd-1040d2215c8e&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1572599986860
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=76332&userId=b0e6cb8f-7059-4227-8ffd-1040d2215c8e&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1572599986860
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=d54b731c-67df-4f18-81ec-93cd1186a5c0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
server
akka-http/10.1.5
content-length
1694
expires
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
set-cookie
tt_exelate=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None tt_skp=; Expires=Sat, 02 Nov 2019 09:19:46 GMT; Domain=.teads.tv; SameSite=None
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1572599986681&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=147
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1572599986681&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=147
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Fri, 01 Nov 2019 09:19:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Fri, 01 Nov 2019 09:19:46 GMT
content-length
23
content-type
image/gif
1a0ca2b9-f752-46d6-83ba-eda2a2c970e1
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/1a0ca2b9-f752-46d6-83ba-eda2a2c970e1
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
7c501972-d560-4047-93de-32095039b11d
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/7c501972-d560-4047-93de-32095039b11d
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
360E6D5F866269BE
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 01 Nov 2019 09:19:47 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
0lnSitnLCeETXaxn9OVbpvWcDygso97eVVZzAWSam171iPiaRMejLG2fjoLwd4swTdteaUST7rI=
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=59759046
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.115 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:47 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 01 Nov 2019 09:24:47 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:50 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:11:53 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Thu, 07 Nov 2019 12:18:41 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.49ff1247b7f696cb6036ee41ad1ec747.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Fri, 01 Nov 2019 09:19:47 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
530 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=16014884&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 - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:48 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
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&_=1572599986896.1137198585
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

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Fri, 01 Nov 2019 09:19:48 GMT
Last-Modified
Thu, 31 Oct 2019 08:12:19 GMT
ETag
"5dba9763-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Content-Length
98
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.2/assets/
14 KB
3 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.2/assets/player.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.2/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:46 GMT
via
1.1 b454a0b154ae18408006bc2a9abd88ec.cloudfront.net (CloudFront), 1.1 varnish
age
333974
x-amz-meta-mtime
1572251676
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
2454
x-served-by
cache-fra19173-FRA
last-modified
Mon, 28 Oct 2019 08:34:37 GMT
server
AmazonS3
x-timer
S1572599987.972482,VS0,VE0
etag
"06641339ce27ddb2d0da0bf718d4974a"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA54
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
3v3o39bR50PQRP_9g4NXcs6knD43suLxGGvH8IdOAjew3FjLGDm-Qw==
x-cache-hits
597514
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7jusCFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHcLY7CaczYo3XAx2u8FwMxssFsPZbjkcbTZD4BDGZjfhbFa84WKw2w2Gm9VyNVxORrPBYDGFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3wxeaTofPda_X_X53ndPnsItcft3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLLwcAAACABwClwn6IH0AAgAgAAAAACQAAAACKgIp_C4ELAAAAAAyAAqwfDQAKDgRxOVw3h_PzDwCAhwAQAIABBRKAAZymEoCKnIMTAAAAAAAAAACW_____xgAPeIzGYAMpcEegAcfgAeigsoiRgAAAAC50tlzR5M6obKoAgAgSLcCuAIACHAzGar6DQMAACAYW6CHxe83O-wav9tlAAAAAAAAAABm_2f_aEJKPkJpQLQt4Gq_gAAAa7-AAABs6gYA8CYAF3QErRgMVmcQk81oN5kdAAAAwN3___-_HohMJi6bZ7lczUbOzXDkWkx2G99wY3PuJrbVYuTxHtgR6YY44vNk34iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3HOAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkyOfLvlajFZKzyzlVs0chjXEtPEuZaYDMPFaOZyuEabtej1MZ0mrt3KMtyiYADVXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22VcmE5fNs1yuZiPnZjhyLSa7jW-4sTl3E9tqMfL4myPfbrlaTNYKz2zlFo0cxrXENHGuJSbDcDGauRyu0WYten1Mp4lrt7IM943VbrJaLpe72b6x2k1Wy-VyN9t36Azf1edsVN60Co_OdFstZqaZ06BwGSzejWp1HH8mB2u0bHTqnM2LRuL3-_1-v9_v9_vFCa9B4TkYFLFEcLpIJ6KX8XQRSyRPi3SiMblGk91mYpnMBjPHxDLZTUYuw3IxnK0mM5dzMRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPz7EcDWXLAZzyWI3VyxWqwQAAAAAAAAAsIQ58yYAAAAAp4EsFoPJYrkAEGKsuwSfUiGPTuBvxY0fQ8zp8ne5LG_N2-LWOX0OKwNI7BQA!&cmcv=&uv=231421&unm=FEED_MANAGER&cb=1572599986953&abt=dppf1_vA!expl_vC!qp2_vE!ufm_vA&baseReportD=taboola.com&dataCenter=am&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:47 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1572599987.975873,VS0,VE53
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4075-HHN
monitoring.js
cdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://cdn.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_128_GCM
Server
34.95.76.218 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
218.76.95.34.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
cca917d5365ca967f37edfa2437c4886dca56067a725a2981f340b6fd6e4d34c

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 08:40:06 GMT
content-encoding
gzip
age
2381
x-guploader-uploadid
AEnB2Up6fcxkBb28KWbWBIoqFkI6RV29e6a49l5I7xNmPtcPOiygZGoU0KIEAyvmbVjFiaSSQYQioQ1c09Zber-poJVlJUuf5fY8f2QpiCDy3CyYMH4YA1g
x-goog-storage-class
STANDARD
status
200
x-goog-metageneration
2
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
19087
last-modified
Tue, 01 Oct 2019 13:46:33 GMT
server
UploadServer
etag
"77e7399c17f6a8f88a9f3f04bc2a1ac1"
vary
Accept-Encoding
x-goog-hash
crc32c=/6g0qA==, md5=d+c5nBf2qPiKnz8EvCoawQ==
content-language
en
access-control-allow-origin
*
x-goog-generation
1569937593104851
access-control-expose-headers
Content-Length, Date, Server, Transfer-Encoding, X-GUploader-UploadID, X-Google-Trace
cache-control
public, max-age=3600
x-goog-stored-content-length
19087
accept-ranges
bytes
content-type
application/javascript
expires
Fri, 01 Nov 2019 09:40:06 GMT
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
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
34.246.21.201 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-246-21-201.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 01 Nov 2019 09:19:47 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
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
34.246.21.201 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-246-21-201.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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/78.0.3904.70 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 01 Nov 2019 09:19:47 GMT
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.124 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Fri, 01 Nov 2019 09:19:50 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/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:21f3:1200:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 11:24:12 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
3189339
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA2-C2
content-type
application/javascript; charset=utf-8
x-amz-cf-id
p6C8CHvLArQ6zFVpMuUwcvjtF4aJKljmmwgc4dtHJJs-e-M0W7AoFQ==
via
1.1 90cf045072373c2c671297de3161846f.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 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%2F78.0.3904.70%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=fffc460d8e87922cc9ae8352be09f974&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=820037344861
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
c657aec2cf93be9dbd3541c88076a93c9b83c6007b8b73cf41047bc715069ca4

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 01 Nov 2019 09:19:50 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 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
63.34.92.224 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-34-92-224.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Date
Tue, 29 Oct 2019 19:18:16 GMT
Content-Encoding
gzip
Last-Modified
Sun, 27 Oct 2019 17:20:37 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame 9671
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBDaZESbZBi7CWiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4208315352051784580
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4208315352051784580
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
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Fri, 01 Nov 2019 09:19:50 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Fri, 01 Nov 2019 09:19:50 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4208315352051784580
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame B6D3
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
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Fri, 01 Nov 2019 09:19:50 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=fffc460d8e87922cc9ae8352be09f974
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Fri, 01 Nov 2019 09:19:50 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
sync
match.taboola.com/ Frame 4B4C
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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.13.12
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Fri, 01 Nov 2019 09:19:51 GMT
via
1.1 varnish
x-served-by
cache-hhn4075-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1572599992.881775,VS0,VE9
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=1&__id=1572599996491&__it=-60&__ic=727391&__iq=83df30ad54b53dcc566da371aa312ad5&__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

Sec-Fetch-Mode
no-cors
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 01 Nov 2019 09:19:56 GMT
Last-Modified
Sat, 24 Oct 2009 09:18:56 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
Fri, 26 Oct 2012 09:18:56 GMT
sync
match.taboola.com/ Frame 9970
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_21/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7CA8CFgP4tC70lJlf6AT4tC70lJlf6AUAAAAGBvQHHMLY7CaczYo3XAx2u8Fws1quhsvJaDYYLKYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDBgSAuh-vmcH7-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA19MLWJ2zryAxOVFBZxAgAAAAgVzp77mhSJ1QWVQAABOlWAFcAAAFuJkNVv1m6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTUjJRygNiLYFXO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA5HJxGXzLJer2ci5GY5ci8lu4xtubM7dxLZajDzeAzsi3RBHfJ7sGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-CGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMmRb7dcLSZrhWe2cotGDuNaYpo41xKTYbgYzVwO12izFr0-ptPEtVtZhlsUDKDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pk4rJ5lsvVbOTcDEeuxWS38Q03NuduYlstRh5_c-TbLVeLyVrhma3copHDuJaYJs61xGQYLkYzl8M12qxFr4_pNHHtVpbhvrHaTVbL5XI32zdWu8lquVzuZvsOneG7-pyNyptW4dGZbqvFzDRzGhQug8W7Ua2O48_kYI2WjU6ds3nRSPx-v9_v9_v9fr844TUoPAeDIpYIThfpRPQyni5iieRpkU40JtdosttMLJPZYOaYWCa7ychlWC6Gs9Vk5nIuJmKJ0nSRTvS6l8VhOHz-gofz8DD7RU_D4fMXPJyHh9kt9vucdrfm79a5jKbPW3U3uTV_t9jv8pzeSqPlLfb7nHa34PK3mF1ul0X9x4cYruaSxWAuWezmisVqlQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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.13.12
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Fri, 01 Nov 2019 09:19:56 GMT
via
1.1 varnish
x-served-by
cache-hhn4075-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1572599997.882287,VS0,VE54

Failed requests

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

Domain
adx.adform.net
URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTU3NDNiNTAzLTE2Y2EtNDdhNS04NDJjLTdmNTAzZjY5YTBmMQ%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPTBlZTZlN2NhLTdhMTUtNGQ4ZS1iMjNhLTI4NWMwNzQ5MjFiMg%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTE2NTMwNzgxLWU1OGUtNGYxNC1hMmU4LTJiNWM5ODA1NDIwYQ%3D%3D&pt=gross&stid=3101ba6e-3ee7-48c3-a373-0fe549a7d08e&fd=1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
adserver.adtech.de
URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572599976816;
Domain
adserver.adtech.de
URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572599976817;
Domain
adserver.adtech.de
URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572599976817;
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
bidder.criteo.com
URL
https://bidder.criteo.com/cdb?profileId=207&av=16&wv=2.24.0&cb=79434642494
Domain
hbopenbid.pubmatic.com
URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Domain
video-adserver.ibillboard.com
URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=bc7cdb349c&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F

Verdicts & Comments Add Verdict or Comment

324 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 object| smbContext object| LUX object| POST_META object| smbt function| b2serp object| smbadloader function| requirejs function| require function| define string| GoogleAnalyticsObject function| ga function| adLoader object| apstag boolean| smbt_only object| DKUIM_SETTINGS 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 function| st_cookie object| is number| USER_PAGE_COUNT string| szmvars object| iom object| _absconfig object| smbVideoService object| iam_data object| pagespeed object| adsbygoogle number| LUX_t_start number| LUX_t_end object| gaLog 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 string| type function| sdibgclick object| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer 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 function| setImmediate function| clearImmediate object| nativendo_588f272a3e49c_conf boolean| apstagLOADED function| _ object| google_tag_manager object| _taboola object| google_optimize function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c object| gapi object| ___jsl function| $ function| jQuery function| isEmpty object| _econa function| send object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk string| preloadType object| de_meetrics object| TRC object| _tblConsole undefined| msg object| _comscore object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| confiant function| webpackJsonpdkuim object| Base64 boolean| dkuimInited boolean| google_noFetch function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcJSONify function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam object| params number| trc_debug_level string| trc_article_id object| TRCImpl number| taboola_view_id object| Criteo object| stroeerCore function| udm_ object| ns_p object| COMSCORE number| _m6rApiLoaded string| sdm_ift object| nativendo_588f272a3e49c_map function| stroeerCoreConnect object| trcManager object| trcRbox object| options object| cmTag function| startCMTagMain object| criteo_pubtag object| teadsscript object| teads object| cp2 boolean| isCmTagFMOnPage 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 object| Adform string| vpaidId function| OvaMediaPlayer object| pbstck function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

13 Cookies

Domain/Path Name / Value
.teads.tv/ Name: tt_skp
Value:
.ih.adscale.de/ Name: tu
Value: 4#0#
.teads.tv/ Name: tt_dar
Value:
.teads.tv/ Name: tt_neustar
Value:
.teads.tv/ Name: tt_salesforce
Value:
.teads.tv/ Name: tt_liveramp
Value:
.teads.tv/ Name: tt_bluekai
Value:
.teads.tv/ Name: tt_viewer
Value: d54b731c-67df-4f18-81ec-93cd1186a5c0
.openx.net/ Name: i
Value: 77e43f4b-eaa4-441c-ab4b-a3e13259c059|1572599986
.teads.tv/ Name: tt_exelate
Value:
.teads.tv/ Name: tt_emetriq
Value:
.adscale.de/ Name: uu
Value: 0b39f937238d4580aec1db91439b3951
www.giga.de/ Name: _econa
Value: 83df30ad54b53dcc566da371aa312ad5

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 (Line 108)
Message:
inline_ad: No video available; loading inline-ad by Teads
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
a.teads.tv
aax-eu.amazon-adsystem.com
acdn.adnxs.com
ad.yieldlab.net
ads.pubmatic.com
adserver.adtech.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
apis.google.com
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
bidder.criteo.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.prod.pubstack.io
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
crops.giga.de
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
eus.rubiconproject.com
fastlane.rubiconproject.com
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
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
lb14.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
native.adscale.de
nugmw.userreport.com
orbidder.otto.de
p.rfihub.com
pagead2.googlesyndication.com
pixel.rubiconproject.com
prg.smartadserver.com
px.powerlinks.com
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
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
sync.teads.tv
t.nativendo.de
t.teads.tv
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
tracking.yieldlove-ad-serving.net
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
adserver.adtech.de
adx.adform.net
bidder.criteo.com
hbopenbid.pubmatic.com
orbidder.otto.de
prg.smartadserver.com
video-adserver.ibillboard.com
104.109.78.125
104.109.82.87
107.178.241.34
108.128.71.27
109.71.25.30
13.224.199.29
130.211.13.252
136.243.33.79
143.204.101.52
148.251.47.137
151.101.112.166
151.101.113.194
151.101.114.49
151.101.13.108
151.101.14.2
151.101.14.217
161.156.66.178
172.217.16.130
176.9.51.135
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
178.250.2.130
18.185.187.173
18.196.229.216
184.30.220.71
185.22.221.117
185.29.135.181
185.33.223.210
188.40.16.106
192.132.33.46
193.0.160.128
193.46.63.75
2.16.122.151
2.18.232.7
2.18.233.180
2.18.233.67
2.18.234.72
2.19.43.224
2001:4de0:ac19::1:b:1a
216.58.207.66
2600:9000:2156:2e00:15:efbc:e300:93a1
2600:9000:2156:ce00:1f:a1b:34c0:93a1
2600:9000:2156:d200:12:6213:9cc0:93a1
2600:9000:21f3:1200:1c:8c89:a300:93a1
2606:4700:20::6819:ad0d
2a00:1450:4001:809::2001
2a00:1450:4001:814::2002
2a00:1450:4001:81a::2002
2a00:1450:4001:81b::200e
2a00:1450:4001:81d::200a
2a00:1450:4001:821::2002
2a00:1450:4001:821::200e
2a00:1450:4001:824::200a
2a02:26f0:6c00:293::2c92
2a02:26f0:6c00:2bc::5f76
2a03:2880:f11c:8183:face:b00c:0:25de
3.248.138.214
34.246.21.201
34.251.1.224
34.95.76.218
35.156.29.62
35.157.25.58
35.186.238.175
37.157.6.252
40.113.136.100
46.253.113.178
52.219.73.52
52.28.163.57
52.42.6.223
52.94.218.7
54.230.95.203
54.93.202.190
62.168.44.118
63.34.92.224
69.173.144.140
69.173.144.165
89.163.159.115
89.163.159.124
91.215.103.64
91.215.103.65
00121dd824abb5a00e96339988e86d79348fbef3619e7035842529f608a945a3
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
01eaaddbf33783ef044e24841a754507c9574b2d05c132194f90a0d3bf79d90e
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0775e1310e014b794b768558720de1878d19dac609080bd1c50ea4744e2aeb1e
07c1ac6e6ae438844b3048f93e59991b35a8d646f80f7be0619b939293b9904d
09442ae0dd813584346fc99901d04ac2d8fce26de34d49ba40f731d18494cbe4
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
1020ce410f42d89ed67b5720a41fd195c062b0f143ba65b36eb58f11f0b664bc
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
20ce00165354bc40041f0dd75824170fd3d0baf803a98defcd3fde1774a320d6
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
2a120cd7d2cd60ebdd670683471d05fd9cb501228623c9fa3420b008aa9e8446
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2b8ce418e95d382001f5c85da4dfd174b01943348092f94f668953d248e73f3e
2bea682bf833e06eab590945958627a2df100801453e7d19c3ebd966d1186e36
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
2e21f3ab5c18c0f77fad070b048fe8ae18b1ba56aaa381aa8e182bd2465a5677
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
301c1b18b937f14b2ca54c68411c9ddc387776b295516a34eaecf7be6211c12c
306bd86c2092aa28d65dd56da1d135b947fd092bea0ee6442a9857e60c15e0a1
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
33c2a4f387faadfa74a45dacf47d7859ee48b2245b56690ec54b2d15edbcc881
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
3752aa6373c6cffb52d27da513bdd2f0b543bbe61b3ae7d56fd0c27c74367fd2
376ae7eda77ca5842e5d5b493a33b618e1fcd7400ec8b2dc934afd81ab580965
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
3eff4b19f68ce57e174c9bc4a9ad7ff56204249cab27cb9a18cb2bb68723b217
3f84e83f46fb67fd307519c00efa7fa757ae59f1e6bac3f21fcce9679f220285
3fa35da37fea8894bd366c48afb08d025a79e74a918e828a7b349d03b1ff4867
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
40453ae86a1fe7ab4249e3cd04be5eb62ac5b2f55edf415beb234f0b6acab8be
4058609ccfe2c56c21b54e1220826f52a1b776664ac077c0c3838b65e0be6192
4377d3a42638a46178ac47f7f549cb5232f3a0c284f63b3023931fb83021225f
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
4569e7429d33daa2505363cd450e5dea11dcece3db7cf0a9074a3e47ce0dc082
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
503846ab82d6e87e84e9beb96dd673802554cdf89c381b7c2ad533c91b4702a2
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
52474baa6d61259ace4625b8fbd1e4d97d87403ab3977e9711606dc5524bc394
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55cc01efeec52b42877704ce9735d1c266528f18bbb1f74120752a054974b04c
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be
57c12efc57ffab5be80537ae2a27eebfdd1d4d0a4438a9323cb5dc576e6ace70
5897fcecbdc03845bde1aa80fc89667ee8e842b538da9018e69596143b0ec246
5cfc0721775a06fa3be9edc41c21eaa73d57f37fef61e185e363768876ed5b81
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d
5ee02fa61d67a2914a23203783a7dac93aecbdc55d0514195cf9b8ee95fb8a70
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
652c3771d069e628d4e2dc42f6fcd663482f99cb14f550e43bd7755ff8b4fe6c
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6d904d6bbc4b820ab764c1b3c90295f2d983600fbba64417a365273edc7d218d
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
6f10b03685724bdfc52c8978adc09b6a4152b8abb18a141faffeeb6772144102
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
72a235e7f09698ff57f17d165b778a42515006c1181b0b438b20fefc53ad5684
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7699c7da63856c957040272eea2918820981cf95ba9ac1fba99cdd60236dc84c
76b3b19a95332a901b3307edbb71056c6915cfc3268025209b2b78bf71f28adc
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7b0df98ea63fbd2481814cf87dd68338fa58d5b663d67557b4a1608ed193fd8d
7d4490a269fa0d8511cfa0e1511a80da079e2dd535ca1b882b1687fc734aa03a
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
83f33dedecaa10ac5807665dafb0ef52c941415261db4f3bc1251611a20c3f4b
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
888f119017e20c10b7bb85058d6a07812dd0f2730dc417200ddaa5fc74c66c73
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8e851426fdd64dbee15e3f999b9b528b45c1ada813496ec03c62f279aaf426c9
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
97330a2d17528e86e02483b488a9625984e4670db18c0b4bf2e216a9432e3c3d
986a1a73fffb8cebf044d02d414d3b6feaaf4aa859a9536def1fd7d2dfc65f8f
9c14e216c7aed649a11d2b47f8c6cf9f586ba7f426132ead03c4061b054ffcbd
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9d9d83e218b77ec50f10293adbdff01bd7e83d3cd2bf70e2aa8507e10c13c670
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221
b2dbb2765ef8da15ab2a6f68aba37ee837a9347911283dea527b4fc5f3175c2f
b40c3274538f0155c83d1a9e4d3a68d94d61425a71cddee3ffd7d38a99465733
b5f0280127c5bea6981151d26ce4b58e1ef4d889f6130c9f6a3cd05577706db1
b602e8ce0a5d8e6d4798ff4de14f4ec304e079692386853ac1e7e2e3ad5c29d0
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b
bbbef7fc3aa998d45c6380e099ceb31f2af4c9bed8e9c9968653f78cd876e88d
bc3795db6cf62ab319ad80ef6a45e970eb0fc201645ffd488adacff17e87d50d
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c0b74996deebf9409b61191121b6d7a8156ba2cfb1db0b3baa429d0d73f1d3b8
c2b3d37bbd5d7c33152f415cd86a5f21fafe59998fa9664445017bb56213285c
c5ce02d4faa9333de3e11f24c4cb2f335edb64ff6c0e9174365e8a34c550e75b
c657aec2cf93be9dbd3541c88076a93c9b83c6007b8b73cf41047bc715069ca4
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
cad43bad6bf9e313533b21a022ac72929bbd656026809564e644f3fa7f70c33e
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cca917d5365ca967f37edfa2437c4886dca56067a725a2981f340b6fd6e4d34c
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912
d2551f438aa7ac58a6a6874b7aff532a8c48263f9aeec594205c1000e7eea1b9
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
db94da7535bbb73e4216ca1faeb26fd270416b54697b49a98a6de2ee8a885d15
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ecd7c13e05f36fd7c2c71d595b309fa90cb716db9f546e24f013a00a83e99def
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f191591317092c16ae5035a97e2458ab65148f5fb07511842baa5700429e03fd
f1d6b82582daaa011bffc148e2bf62f621380195161a6fe56804e1b6e686fad6
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f68310371d726b752313d50c65838e131f22cd2e942e99a57afbedb63332a836
f6a35a30c444e5d9611c4f9e8da25bfb2303279f93f1810a6b18370dc5f83c1e
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
fdabf266bf690c50a183e1bd4a24361f850940d704eb63098a1acdf47a5d1b62
ff173dd4735ac42b87fef47ff6ce919d98fb4526968bcab620da44c9e952fa21