Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On December 15 via api from GB

Summary

This website contacted 59 IPs in 11 countries across 45 domains to perform 243 HTTP transactions. The main IP is 2a00:13c8:f5::f:4b3d:148, located in Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust TLS RSA CA G1 on July 29th 2019. Valid for: a year.
This is the only time www.golem.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
2 79 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 2a02:26f0:64:... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
14 2a00:1450:400... 15169 (GOOGLE)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
18 172.217.23.98 15169 (GOOGLE)
1 13.35.253.119 16509 (AMAZON-02)
2 23.210.248.245 16625 (AKAMAI-AS)
3 9 2.19.33.59 20940 (AKAMAI-ASN1)
1 1 2600:9000:214... 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
3 2a00:1450:400... 15169 (GOOGLE)
3 52.222.153.2 16509 (AMAZON-02)
10 3.122.43.86 16509 (AMAZON-02)
10 136.243.4.7 24940 (HETZNER-AS)
2 6 23.210.249.210 16625 (AKAMAI-AS)
3 104.16.190.66 13335 (CLOUDFLAR...)
1 37.157.4.24 198622 (ADFORM)
2 104.108.37.125 16625 (AKAMAI-AS)
1 185.64.189.112 62713 (AS-PUBMATIC)
3 185.33.223.202 29990 (ASN-APPNEXUS)
4 185.86.138.32 201081 (SMARTADSE...)
5 35.206.134.202 19527 (GOOGLE-2)
1 23.210.249.164 16625 (AKAMAI-AS)
1 178.250.0.165 44788 (ASN-CRITE...)
1 3 34.95.120.147 15169 (GOOGLE)
4 2a00:1450:400... 15169 (GOOGLE)
2 151.101.113.194 54113 (FASTLY)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 116.203.212.0 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:205... 16509 (AMAZON-02)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
6 95.216.24.149 24940 (HETZNER-AS)
1 2600:9000:205... 16509 (AMAZON-02)
2 52.217.36.102 16509 (AMAZON-02)
1 3 2a00:1450:400... 15169 (GOOGLE)
2 2 216.58.207.34 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
3 143.204.214.52 16509 (AMAZON-02)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 89.163.159.110 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
4 52.208.73.164 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 89.163.159.121 24961 (MYLOC-AS)
1 2600:9000:205... 16509 (AMAZON-02)
2 217.79.188.8 24961 (MYLOC-AS)
1 143.204.214.83 16509 (AMAZON-02)
1 34.249.185.179 16509 (AMAZON-02)
1 1 89.163.159.116 24961 (MYLOC-AS)
1 178.250.0.130 44788 (ASN-CRITE...)
1 34.248.95.73 16509 (AMAZON-02)
3 136.243.104.22 24940 (HETZNER-AS)
1 23.210.249.92 16625 (AKAMAI-AS)
2 151.101.13.108 54113 (FASTLY)
243 59
Apex Domain
Subdomains
Transfer
100 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de Failed
ads.golem.de
account.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
25 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
stats.g.doubleclick.net
310 KB
10 meetrics.net
lb69.s400.meetrics.net
3 KB
10 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
2 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
7 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
147 KB
6 googletagservices.com
www.googletagservices.com
172 KB
5 otto.de
orbidder.otto.de
726 B
5 adnxs.com
ib.adnxs.com
acdn.adnxs.com
4 KB
5 adscale.de
ih.adscale.de
js.adscale.de
8 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 smartadserver.com
prg.smartadserver.com
5 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
59 KB
3 google-analytics.com
www.google-analytics.com
18 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
3 districtm.io
dmx.districtm.io
cdn.districtm.io
739 B
3 amazon-adsystem.com
c.amazon-adsystem.com
29 KB
3 google.de
adservice.google.de
521 B
3 ioam.de
script.ioam.de
de.ioam.de
13 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 adition.com
adfarm1.adition.com
2 googleapis.com
imasdk.googleapis.com
91 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
58 B
2 yieldlab.net
ad.yieldlab.net
2 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 mxcdn.net
s400.mxcdn.net
s385.mxcdn.net
51 KB
1 criteo.net
static.criteo.net
14 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
581 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
10 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 googletagmanager.com
www.googletagmanager.com
27 KB
1 criteo.com
bidder.criteo.com
142 B
1 casalemedia.com
as-sec.casalemedia.com
902 B
1 adform.net
adx.adform.net
1 KB
1 google.com
adservice.google.com
171 B
1 nuggad.net
si.nuggad.net
546 B
1 yieldlove.com
cdn-a.yieldlove.com
83 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
60 KB
243 45
Domain Requested by
77 www.golem.de www.golem.de
cdn.stroeerdigitalgroup.de
www.googletagservices.com
18 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb69.s400.meetrics.net www.golem.de
10 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
9 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
7 video.golem.de www.golem.de
text
7 cpxl.golem.de www.golem.de
6 tt.onthe.io cdn.onthe.io
6 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
5 orbidder.otto.de cdn-a.yieldlove.com
4 googleads.g.doubleclick.net pagead2.googlesyndication.com
4 tpc.googlesyndication.com securepubads.g.doubleclick.net
4 prg.smartadserver.com cdn-a.yieldlove.com
4 ih.adscale.de 2 redirects www.golem.de
js.adscale.de
3 ssl.1.damoh.golem.de text
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 www.google-analytics.com 1 redirects www.googletagmanager.com
www.golem.de
3 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
3 c.amazon-adsystem.com cdn-a.yieldlove.com
c.amazon-adsystem.com
3 adservice.google.de securepubads.g.doubleclick.net
3 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 acdn.adnxs.com cdn-a.yieldlove.com
2 uss.xplosion.de www.golem.de
2 adfarm1.adition.com cdn.stroeerdigitalgroup.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 cm.g.doubleclick.net 2 redirects
2 s3.amazonaws.com www.golem.de
text
2 de.ioam.de 1 redirects www.golem.de
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 ad.yieldlab.net cdn-a.yieldlove.com
www.golem.de
2 dmx.districtm.io cdn-a.yieldlove.com
www.golem.de
2 ads.golem.de www.golem.de
2 golem.de 2 redirects
1 cdn.districtm.io cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 static.criteo.net cdn-a.yieldlove.com
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 sak.userreport.com nugmw.userreport.com
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 s0.2mdn.net imasdk.googleapis.com
1 cdn.radiantmediatechs.com www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 d.agkn.com js.agkn.com
1 cpx.golem.de www.golem.de
1 account.golem.de www.golem.de
1 js.agkn.com cdn.stroeerdigitalgroup.de
1 www.googletagmanager.com www.golem.de
1 cdn.onthe.io www.golem.de
1 s385.mxcdn.net cdn.stroeerdigitalgroup.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 bidder.criteo.com cdn-a.yieldlove.com
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 adx.adform.net cdn-a.yieldlove.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 adservice.google.com securepubads.g.doubleclick.net
1 nugmw.userreport.com www.golem.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
243 71

This site contains links to these domains. Also see Links.

Domain
video.golem.de
forum.golem.de
redirect.golem.de
www.facebook.com
twitter.com
ads.golem.de
jobs.golem.de
Subject Issuer Validity Valid
*.golem.de
GeoTrust TLS RSA CA G1
2019-07-29 -
2020-09-26
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
*.google.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
meetrics.net
Let's Encrypt Authority X3
2019-12-03 -
2020-03-02
3 months crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
orbidder.otto.de
Let's Encrypt Authority X3
2019-10-23 -
2020-01-21
3 months crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
*.criteo.com
DigiCert ECC Secure Server CA
2019-12-05 -
2021-04-08
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-02
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2019-03-19 -
2020-03-19
a year crt.sh
*.storage.googleapis.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months 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
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adition.com
AlphaSSL CA - SHA256 - G2
2019-05-02 -
2021-05-02
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-12-03 -
2021-04-06
a year crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-12-02 -
2020-03-01
3 months crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh

This page contains 23 frames:

Primary Page: https://www.golem.de/
Frame ID: A44EBD8A9F8296DC55ED5E15B07A02DA
Requests: 212 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576426635&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635840&bpp=8&bdt=381&fdt=130&idt=130&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=6980513374539&frm=20&pv=2&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&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=293&ady=3986&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&btvi=1&fsb=1&xpc=3I25a4iRF8&p=https%3A//www.golem.de&dtd=141
Frame ID: 326B186E708FDADF328CBC6712E61135
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576426636&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635848&bpp=5&bdt=389&fdt=199&idt=199&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&dssz=55&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=293&ady=4707&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&btvi=2&fsb=1&xpc=515Gvsi2D5&p=https%3A//www.golem.de&dtd=203
Frame ID: 6284C2A3241F390E440DDB94844CF837
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=822190710&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%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: 32C4313EA2FA95ADDB025A1475778AB2
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1576426636&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1576426635943&bpp=3&bdt=484&fdt=184&idt=184&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=184763050883840&dssz=55&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&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=6&uci=a!6&fsb=1&dtd=190
Frame ID: 9FDD5B3E32A28B09C700F7916DBF9447
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.355.3_de.html
Frame ID: 5C0F72352E109963AC8FEEDB4A174854
Requests: 1 HTTP requests in this frame

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst4nO9P_njx2WF4mF5na217vcuBb1pWRPeo6r114v55lsFPd0_tb8Z3Vn8H0aBwGG4vPbA4I9W6jedkAV59FohvUv3WoV4wJk2SIg41QFhOxJyjv3VsGAd3UBWndhw_wHa4YdSB7Wj_P925j1U39FZ5Ig8VD7kuEBkaoCQ4z6Rul9gp2edBAn4ofrO20Lq9fG6vr9DMXSSK8ctGpw1yC0jRwboJ_zGfPsNky6xlIGXZ9KGr90d8u2zk8HHDYfoLHAhhmAckT317FO0XIQwunkQ0V0wZL0i7ZZokajTwF5VLfQj5-GXI02sLd89o2Lx30Sk2xw&sai=AMfl-YT6TrUZK5_U5d4C4JD1gXGDfpjLwDoILbZPrw7OPVlLGj2Kb6mTf-_Xx8WB4pP041kihy4QSB4ORzMA4PubexGn4WMNPeha8c69xEG59Q&sig=Cg0ArKJSzGG90UI33KqiEAE&urlfix=1&adurl=
Frame ID: 57F1B05DA101EFC99DB2D71D1F548D95
Requests: 2 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstDsRd4ljAgvPiP2E3qDs0PYa0Dq5IE3a7LZdEYivsQwtsW0y1szH-p54v5QYZyqKJ3KrYxsqDRqrRJ6r-mkPFpLinCs_ycBJ5jm2NPd4uoP-EUrKdGVav1ammXLjDUgXe7jS_TimQE6mlzFpS_g6eB_isKm633n8cCjqLny2hWTdj5fqC7EMNLC8BZ6TXFKRu7UN85yn-oo3ziEmFlnQJarzQ3OB9RMvfDcm8DG70dQoyiLjRDQ08TNKToRqEyw9PJDASCT3hIz3lLhuvus8Pz4Ux7BKRX0KbjNe3AlZ74EmD7plPglMsFst-4FCUZSZ7WKA&sai=AMfl-YSoIQv8pbhsS9hXez487OGd4xuaNxw7bNZsvCzHNvs0Qe70VTpWHrT_2u-WdCZXZBnuuHdJI29o-_II2rPAujWUVt7cyThThPlsMVvXAw&sig=Cg0ArKJSzJ7CzGqunZBnEAE&urlfix=1&adurl=
Frame ID: 3FC74D53CD5EF39B88744B6E51A6E594
Requests: 2 HTTP requests in this frame

Frame: https://adfarm1.adition.com/banner?sid=4399261&kid=3386627&wpt=H&ts=844912697&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsvSTmzNYcfzKrgkR1C0niRSLgmjcYHkHcas90lRA5booo4mTFHDYMOY2BZBtoDoRupQzXFezAQfpeYOGqg2qBV7lYptGkoRrxJ3nbFRIcccRF0PZyRinDILIsEDMxgB227gQZT41JhF0RHQ0Hbuny8tCuHldG2gmDQmTrauHU0p9XRqp9ooY6kBMFWi20yw59OBnLc5H2G_9kKdzdL_Za8N2r5gXuOfRzpUkwlez5gewk7wDQUOBQHaRRmam3I3NyHnydXtZWHDq52mGthz2UCu&sai=AMfl-YR9Xcq9PAaaqpHI0ybZRrra-e0mLCJ7hbgTfC2UfFh6i_Vi8DGBL0gfrjJo88CLky7irhKyeHtdiJsNzYRrTw7OOiLXgfVGJzbhFGPJMw&sig=Cg0ArKJSzJM7InWsycVWEAE&urlfix=1&adurl=[url_plain]
Frame ID: DC68EC2551D3D9EE9DF52EF9899F2F18
Requests: 1 HTTP requests in this frame

Frame: https://adfarm1.adition.com/banner?sid=4399236&kid=3386627&wpt=H&ts=844912697&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsvSTmzNYcfzKrgkR1C0niRSLgmjcYHkHcas90lRA5booo4mTFHDYMOY2BZBtoDoRupQzXFezAQfpeYOGqg2qBV7lYptGkoRrxJ3nbFRIcccRF0PZyRinDILIsEDMxgB227gQZT41JhF0RHQ0Hbuny8tCuHldG2gmDQmTrauHU0p9XRqp9ooY6kBMFWi20yw59OBnLc5H2G_9kKdzdL_Za8N2r5gXuOfRzpUkwlez5gewk7wDQUOBQHaRRmam3I3NyHnydXtZWHDq52mGthz2UCu&sai=AMfl-YR9Xcq9PAaaqpHI0ybZRrra-e0mLCJ7hbgTfC2UfFh6i_Vi8DGBL0gfrjJo88CLky7irhKyeHtdiJsNzYRrTw7OOiLXgfVGJzbhFGPJMw&sig=Cg0ArKJSzJM7InWsycVWEAE&urlfix=1&adurl=[url_plain]
Frame ID: F07693B98A03D403A68E4C037F345362
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuOrPXoVPjA_8CY0vLxPomZIA3cPmTwLlcsLvJgCZmID1emlnBUdomNEs1j_yFfAsK7mDEBXJPPaufskLY4y9iv3LqUlcBFwS8Lg2FESYg-P6_YHgRASxdrqCczXt0U0hLEI-w5UwQae311Nos-lZDqx9Fp80Sjf7Yu4AqawBCAfL49LYrpI-HtglgUGV8bMpvD2FG2Ka_n2nkRIiBVIEMHEs3Six1EDpE8kTcA1TgPIX0r2hlfFMyMaUzlOfn2wX7yqtIfxXW1c175M6nuj7RY&sai=AMfl-YTzRQHdOffHh1sAgbwAZg_eCZuL-bpUIthvhXz0aEhK6WqhmNMC4XfMYhyUSXZ4dtCCRv2eg0T05vfD_aBb6SdonTAHfoQHmRQwv6jbDQ&sig=Cg0ArKJSzCXBra9ZRzSmEAE&urlfix=1&adurl=
Frame ID: 211244D8F7C4E101851D28F9C5FAA59E
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuDh5ZK-TBQ0L2ILRzRk5XW9OWH-zInSNoa1vWgVX8hJN_tRGaCy1S9_cfcm-pMzF2elCeLCruWwXuN5Wvb8p-f43gj0SPCmCXUK1Z6PDVWiT69-8VnmzAO51o0tmF5yLNDtASzKfl2FKG_jbe9Nwwo9PpONf7-hGtAVp11tVWWjiyKHlorQ1MG1wDkkVs54RXC-phFeJ5n6fY4bUzFiB6fBCMaXmW-c9VJfI35KHUifFSduXF0bI1uGTSrv-qMQ8KY8H_Wq5oZdhAjg0DMPH0zd3Nm&sai=AMfl-YSteAM9KphUEup6ox7ksrfV22RcH3JKbAuxdHtHtX60XPAxcdmYI8i5NLsp-ui-UYj0Uu_ZAWED4NCh1nqS7XBpdKfXVMqd_HaHrs4Gog&sig=Cg0ArKJSzD2-2ataBL46EAE&urlfix=1&adurl=
Frame ID: 1FE3A4FAA410CFC998F5274246DC61B0
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuFm2rw-4b---QZMTmKq2MtZqDjrEvByLmYthibpKxMp8Gie0TdPnjpaSC5r4jyK0Cjv37lSvZBxQ65MJbAild_2O3tywVjkLzk4fRdcxX5x-HHy3CWnTJPfSgKBJNMt6h0tJijRKdwcgA0x9nEl3AaVEEKXXjZYbaq_d0Iz2A9YhlxJp_kFOKIso68iT6LoXdY0Eqta0kdvp0y-ajZOcMUcMO_zro1h0TDQwzbHtUGZhaka5NgmPTuUB2owLqOcXpfaiKdPCFIxdtvs1kxz7TSCEf1&sai=AMfl-YTn1dpIII66sgvrQ9mnkPqgowq2Q8s5jhZIpuIm5JVoRhX3tZgoH6xL3VIvoZkZ2wJpjzAFD8JHjY35fy2AHWfnOIlabz5K1tjh3LsR6g&sig=Cg0ArKJSzPJvraL0iTDgEAE&urlfix=1&adurl=
Frame ID: BE59726B9D752F26DF3C2D1335622366
Requests: 9 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4212424181921045915
Frame ID: 546785E9CFA7E32D0C793F6B2CC46DBB
Requests: 1 HTTP requests in this frame

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

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

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

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

Frame: https://cdn.districtm.io/ids/index.html
Frame ID: EE8348727AD1D1872D311AC0D08EA5AC
Requests: 1 HTTP requests in this frame

Frame: https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Frame ID: 9DF2CF1C7F651EB859C9FDF6E2A61CC0
Requests: 1 HTTP requests in this frame

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

Screenshot


Page URL History Show full URLs

  1. http://golem.de/ HTTP 301
    https://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Detected technologies

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

Page Statistics

243
Requests

100 %
HTTPS

34 %
IPv6

45
Domains

71
Subdomains

59
IPs

11
Countries

3190 kB
Transfer

6216 kB
Size

19
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. http://golem.de/ HTTP 301
    https://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 26
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 27
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Request Chain 81
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&i3=000fbda6dce7542605df65c8b%3A1604247435906%3A1576426635906%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576426635906&n1=2&dntt=0&lt=1576426635907&ev=&cs=vet2z1&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&i3=000fbda6dce7542605df65c8b%3A1604247435906%3A1576426635906%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576426635906&n1=2&dntt=0&lt=1576426635907&ev=&cs=vet2z1&mo=1&sr=71
Request Chain 157
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b307b3d14cffddca649d7d38f3cc5922&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db307b3d14cffddca649d7d38f3cc5922%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b307b3d14cffddca649d7d38f3cc5922&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db307b3d14cffddca649d7d38f3cc5922%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=686a192e403f4ad69c827210cb107502 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b307b3d14cffddca649d7d38f3cc5922&userId=adscale-user:686a192e403f4ad69c827210cb107502
Request Chain 158
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=b307b3d14cffddca649d7d38f3cc5922
Request Chain 159
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swez0Uz_3cpknX0488xZIg HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swez0Uz_3cpknX0488xZIg&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 160
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=b307b3d14cffddca649d7d38f3cc5922
Request Chain 162
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1610231706&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=IAhAAUAB~&jid=2039176703&gjid=671966902&cid=603523472.1576426636&tid=UA-518800-2&_gid=144682408.1576426636&_r=1&gtm=2ouc61&z=1997919453 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=603523472.1576426636&jid=2039176703&_gid=144682408.1576426636&gjid=671966902&_v=j79&z=1997919453
Request Chain 221
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWD_kWDwsWDRkEiUkWsfABifABSfABSfABi7ABifABfrr&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=4212424181921045915
Request Chain 251
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1

243 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://golem.de/
  • https://www.golem.de/
191 KB
44 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e28262de85aa9b9ce32f355fc9caa973d53e18ada15113c77b910d4a0eeaf144
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

Request headers

Host
www.golem.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/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
navigate
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/74.0.3729.169 Safari/537.36

Response headers

Server
nginx
Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_74; expires=Mon, 16-Dec-2019 04:17:15 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-289dc22540ecdcd0ff302a5f3c0be706"
Content-Encoding
gzip
Vary
Accept-Encoding
X-UPSTREAM
unix:/var/run/php-fpm-www.sock

Redirect headers

Server
nginx
Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Type
text/html
Content-Length
178
Connection
keep-alive
Keep-Alive
timeout=3
Location
https://www.golem.de/
golem_main_135-min.css
www.golem.de/staticrl/styles/
76 KB
21 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_135-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
61a1467b8f50a64d99427cd8819f6a72791767799707d7da7f5b10ff55f0e51e

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Fri, 15 Nov 2019 14:14:54 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
245 KB
60 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:64:493::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
29fb337f70b281dafbd92bcf1dc5a61c98279fb589df86249ebe07dcb9342d90

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-amz-request-id
E69779546049AED5
status
200
access-control-max-age
86400
content-length
60957
x-amz-id-2
scwQJuigIbr6eLlbmNnSph2CbRF10AfbR+m/PEFCmTXfO+/OaP+8X4zHQyP57tr73SwWti1szNs=
last-modified
Fri, 13 Dec 2019 14:57:08 GMT
server
KONICHIWA/1.0
etag
"18a62b8b0f1210039914c9635cc41073"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=354
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-e82"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145549-217049-217047_rc.jpg
www.golem.de/1912/
12 KB
13 KB
Image
General
Full URL
https://www.golem.de/1912/145549-217049-217047_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
35209a9378fa2d9545a74c40e8d8813c16d0fe90d974395c17d975f89f83bc0b

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sun, 15 Dec 2019 11:25:03 GMT
Server
nginx
ETag
"5df6180f-30ca"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
12490
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145548-217034-217031_rc.jpg
www.golem.de/1912/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145548-217034-217031_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0d33ad69a547935e1e7f0c192b196a82ecd23cde79a176b769b79d8473504a4c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sun, 15 Dec 2019 10:15:03 GMT
Server
nginx
ETag
"5df607a7-18dc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6364
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145551-217046-217043_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145551-217046-217043_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0faee9d650c237f7f4e5715e92b3a0d362b32fe92bd21d4ff5229533a03b6eb1

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sun, 15 Dec 2019 11:10:03 GMT
Server
nginx
ETag
"5df6148b-1aee"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6894
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145547-217030-217027_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145547-217030-217027_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2c616818963f78e94e98b0c8b9f8f6b0e2f69a4ed04046648c1a0c25aca5a15c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sun, 15 Dec 2019 09:45:03 GMT
Server
nginx
ETag
"5df6009f-1dba"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7610
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145550-217042-217041_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145550-217042-217041_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8ec03c1085ee3786d826726ead14faa5ee36b122d78306f4de0f54e23256d766

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sun, 15 Dec 2019 10:43:03 GMT
Server
nginx
ETag
"5df60e37-1de8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7656
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145543-217012-217008_rc.jpg
www.golem.de/1912/
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/1912/145543-217012-217008_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b910127374d0859902ba945dc7add297b4d1fde4b2fc89488fa1df79612cb501

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sat, 14 Dec 2019 11:09:03 GMT
Server
nginx
ETag
"5df4c2cf-2c8a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11402
Expires
Wed, 15 Jan 2020 16:17:15 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1576426142&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
799
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
robomaster-snap.jpg
video.golem.de/teaser/1/1/23863/thumb-high-1000/
0
0

wr-snap.jpg
video.golem.de/teaser/1/1/23877/thumb-high-1000/
106 KB
107 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23877/thumb-high-1000/wr-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
05e5e421628198d0416646ef6faadd33f8c5f66dc4a7c1629a0cf7c284b3a227

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 14:36:52 GMT
Server
nginx
ETag
"5df3a204-1a95f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
108895
Expires
Wed, 15 Jan 2020 16:17:15 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1576425242&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
798
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
145349-216188-216185_rc.jpg
www.golem.de/1912/
192 KB
193 KB
Image
General
Full URL
https://www.golem.de/1912/145349-216188-216185_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1509362b6c5361c8b29dfefd5e9c484fe64073c9139226c40f08ee517c0f1de1

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 09 Dec 2019 07:59:04 GMT
Server
nginx
ETag
"5dedfec8-30125"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
196901
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145428-211819-211815_rc.jpg
www.golem.de/1912/
115 KB
116 KB
Image
General
Full URL
https://www.golem.de/1912/145428-211819-211815_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c447e7c23baa0c7424dd430964035ddd3be41dd3ca4ecf29b7b577cc2c25e9a3

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Tue, 10 Dec 2019 13:40:03 GMT
Server
nginx
ETag
"5defa033-1cd85"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
118149
Expires
Wed, 15 Jan 2020 16:17:15 GMT
191212-golem_Seminar_Kubernetes_Jan20_FFM.jpg
www.golem.de/_img/
38 KB
38 KB
Image
General
Full URL
https://www.golem.de/_img/191212-golem_Seminar_Kubernetes_Jan20_FFM.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
341ae8b7babc44d0c3bcf125b6fe8ea3a0a58f3e124b517a311ea01b5dc4da23

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 17:41:37 GMT
Server
nginx
ETag
"5df3cd51-9690"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
38544
Expires
Wed, 15 Jan 2020 16:17:15 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
longread-swiper_133-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
account_js_rl19_1_1.php
www.golem.de/abo/
4 KB
3 KB
Script
General
Full URL
https://www.golem.de/abo/account_js_rl19_1_1.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
16ed47f1cd79f4b87625326a7befd9b70374e4ac4d1b3ca9a5018db0741320aa

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
unix:/var/run/php-fpm-www.sock
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 21 Oct 2015 16:29:00 PDT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
104 KB
37 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
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
68bcdec2fdc6ce23468b97a8c39a3f9eb86233e03be5072bf3b438ac1433714d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
37933
x-xss-protection
0
server
cafe
etag
2924851815849280674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sun, 15 Dec 2019 16:17:15 GMT
golem_csi-133-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
sdcv.js
ads.golem.de/
63 B
402 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Wed, 15 Jan 2020 16:17:15 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
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 000f
Resource Hash
6c7941ec9ceb8f3b1b5f35f1eb05e1b44c0db416386acdba81278a6f69cbd9e7

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000f
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
Sun, 15 Dec 2019 18:17:15 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"367 / 899 of 1000 / last-modified: 1576171782"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15846
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:15 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
272 KB
83 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.119 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-119.fra6.r.cloudfront.net
Software
/ Express
Resource Hash
9e45b6381a26ea57fc04c2839a97286570c05a63f0aeee42f2091bc8e61f18d2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:02:24 GMT
content-encoding
gzip
age
891
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA6-C1
access-control-allow-origin
*
x-amz-cf-id
YwOcHyJSPW3lbslNcxz7LLkli7QBKH5Gr-vCE4fA-lazkxmmvoNw0A==
via
1.1 9bca546700a965c9c77ef5b8dbe65cc4.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.248.245 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-248-245.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.golem.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/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
  • https://nugmw.userreport.com/rc-ap/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:6000:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
580f84eaf8bac2198853f91f9a8558b193188ce15d89ea1da26ee451d188744f

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
via
1.1 e8b17f734954ee4d46d26cf302323482.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA53-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=86400, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1806
x-amz-cf-id
c7gEmzm8i0ZLxPZUJtxOmRcThJ4cU5GuTckZOXkhYtwTlhCbnuIF6A==

Redirect headers

date
Sun, 15 Dec 2019 16:17:15 GMT
via
1.1 1764af62d635a1a6ee51aabc37405452.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA53-C1
location
https://nugmw.userreport.com/rc-ap/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
access-control-allow-methods
get, post, options
status
302
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
yvJ2ThHdfqWzgI8LQJkq43WujirHC3HlMgqhsAWQJpX-_1WoklMPjQ==
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Wed, 15 Jan 2020 16:17:15 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Wed, 15 Jan 2020 16:17:15 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Cache-Control
max-age=2678400
ETag
"5dc995a0-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
X-Cnection
close
Accept-Ranges
bytes
Content-Length
21448
Expires
Wed, 15 Jan 2020 16:17:15 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

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

Response headers

Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Wed, 15 Jan 2020 16:17:15 GMT
dmp
tracking.m6r.eu/sync/
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
24760e5c78c3d648ed26a81c9825849d0659f00395de03da589b4cf8d1c32a16

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 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.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
107
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
147 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

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

Response headers

Content-Type
image/svg+xml
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-6624"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26148
Expires
Wed, 15 Jan 2020 16:17:15 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
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
2a00:1450:4001:818::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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
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
2a00:1450:4001:814::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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:15 GMT
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.153.2 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-153-2.fra53.r.cloudfront.net
Software
Server /
Resource Hash
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 14 Dec 2019 16:30:36 GMT
content-encoding
gzip
server
Server
age
85599
etag
6bed68e25cc35021d570267b56047ef8
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53
accept-ranges
bytes
x-amz-cf-id
xJuIrZopkhv29VmaEF3NoKXBOEkQsTpdAK3VCclLwCd3nr0D2HTWUQ==
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
btn-follow-sp4b.png
www.golem.de/staticrl/images/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4b.png
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-b0e"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Wed, 15 Jan 2020 16:17:15 GMT
submit
lb69.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb69.s400.meetrics.net/bb-mx/submit?/bXabBTAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSAvCPAAAAAAAAAOAAAAGFAAAAAAZwSAvCBRksFAQtjFh5kuSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sun, 15 Dec 2019 16:17:14 GMT
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabCUAAATkzFARksFAQtjFtuJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:14 GMT
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
52.222.153.2 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-153-2.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 03:38:00 GMT
content-encoding
gzip
vary
Origin
age
45556
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 23082ff4de65f70078e091bc7cd0cf24.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53
x-amz-cf-id
lF5sL-_hH8N3wrEo9ICF63kNYLkT-nRCFkABAeQrtGvXePajC6u66Q==
nuggad
ih.adscale.de/
49 B
482 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=4&d4=6&d11=0&d8=2&d9=4&d12=2&d1=1&d3=5
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.210.249.210 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-210.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 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
Sun, 15 Dec 2019 16:17:15 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.210.249.210 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-210.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Dec 2019 16:57:01 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
Mon, 16 Dec 2019 16:17:15 GMT
bid
c.amazon-adsystem.com/e/dtb/
23 B
366 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3505&u=https%3A%2F%2Fwww.golem.de%2F&pid=To9ioFooS3540&cb=0&ws=1600x1200&v=7.45.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22120x600%22%2C%22200x600%22%2C%22301x601%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_1%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_1%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_2%22%7D%2C%7B%22sd%22%3A%223%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_4%22%7D%2C%7B%22sd%22%3A%224%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x250_2%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
52.222.153.2 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-153-2.fra53.r.cloudfront.net
Software
Server /
Resource Hash
745a085b52b8371ec6705413fca70a28c6d8bff0db480e6b124bd08c54e95ef8

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
server
Server
x-amz-cf-pop
FRA53
status
200
vary
User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
23
x-amz-cf-id
aDxEyjQHHdI-2-nDoe6LYTeEoaGLKjPaFMkpdK-ErUQ1_V5POaH-jQ==
v1
dmx.districtm.io/b/
0
450 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Access-Control-Request-Method
POST
Origin
https://www.golem.de
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
cf-cache-status
DYNAMIC
server
cloudflare
access-control-allow-origin
https://www.golem.de
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin, Accept-Encoding
access-control-allow-methods
OPTIONS, POST
status
204
access-control-max-age
14400
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
5459ba09eb3bdfd7-FRA
access-control-allow-headers
origin, content-type
/
adx.adform.net/adx/
2 KB
1 KB
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWVhOGNmY2Q0LTIxNjMtNDQzNy1hZTYzLTE2OTVhMTRjZTM4NA%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPWQxNTM0OTI0LTQ3MjMtNGQwNi1hZTZjLTQ4Y2Y1OTI4MjM4ZQ%3D%3D&pt=gross&stid=3b2fb911-44ec-4a77-ba13-0d43257dbbe4&fd=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.24 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
d40c754096ea82a106dcd26815742b8af6e8cc2999bbe6ca3eecc4a1ebcdd28b

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.golem.de
access-control-max-age
86400
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
9767285,9767287,9767288
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/9767285,9767287,9767288?ts=1576426635803&json=true
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.108.37.125 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-37-125.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 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.golem.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
28
Expires
Sat, 14 Dec 2019 16:17:15 GMT
translator
hbopenbid.pubmatic.com/
0
58 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
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?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
ff9123fd26cd1c19cd81666296b20cc4e41b3ad5eb7319c8fe935fabcfd5c3c3
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Date
Sun, 15 Dec 2019 16:17:17 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
144.76.109.30; 144.76.109.30; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.54:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
17fd9dc8-a3a7-413d-821a-b95e04329fd0
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
X-SMRT-D
4%3b9%3b54
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
X-SMRT-D
4%3b25%3b55
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
X-SMRT-D
4%3b20%3b67
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
X-SMRT-D
4%3b3%3b82
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
146 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
cygnus
as-sec.casalemedia.com/
25 B
902 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=335654&v=7.2&r=%7B%22id%22%3A%22347031b8e8d312a%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2235f195a19677e44%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22335654%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2236f645f2efc356f%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%223753ae5ca8fc18%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%223844cff9c2480ac%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%223934b5ea47a8891%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%224041a5ba63bf23a%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2241a932a7b8459a%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2242677f4f1fd04d4%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%224332a12bf9d948c%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22443a0a68dfa84db%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2245cc409789d7a1e%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2246bc28f094c4e9a%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.249.164 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-164.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
1b48cdd3a4523fc686017e8e5e15b194f88a51c685582696abf90f5ee10bd4ee

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
45
Expires
Sun, 15 Dec 2019 16:17:16 GMT
prebid
ib.adnxs.com/ut/v3/
489 B
1 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?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
db09f8d342d5de0e6b5db56920ac175e983492a8c109bb807dbfb1142bbf1346
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:17 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.168:80
AN-X-Request-Uuid
c7d4832c-45fb-484f-96a3-6723ff7ced89
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
489
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
cdb
bidder.criteo.com/
0
142 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=16&wv=2.24.0&cb=21933978124
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.165 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 15 Dec 2019 16:17:15 GMT
access-control-allow-credentials
true
server
Finatra
access-control-allow-origin
https://www.golem.de
timing-allow-origin
*
vary
Origin
arj
yieldlove-d.openx.net/w/1.0/
11 KB
2 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=39ad574d-3d2a-4c96-b12c-80fa952096a2%2Cea8cfcd4-2163-4437-ae63-1695a14ce384%2Ceafcbfe7-d4d7-4fc5-b4d6-194b21abb0c4%2Cd1534924-4723-4d06-ae6c-48cf5928238e%2Cbeae27a5-6663-48d2-9b60-97f0e496d5ef&nocache=1576426635810&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner%2Cbillboard2&auid=540523394%2C540523392%2C540523393%2C540523387%2C540651907&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.171.0 /
Resource Hash
fb764e83b3323ec38ff3a7298014f51287580d7c2d656f4e4ee195e1dc8cfc70

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
server
OXGW/16.171.0
status
200
vary
Accept, Accept-Encoding
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.golem.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
1228
via
1.1 google
expires
Mon, 26 Jul 1997 05:00:00 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstart...
s385.mxcdn.net/679600/
2 KB
2 KB
XHR
General
Full URL
https://s385.mxcdn.net/679600/%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbillboard2,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fposterad,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle2
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.248.245 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-248-245.deploy.static.akamaitechnologies.com
Software
nginx/1.10.3 /
Resource Hash
ecd5e1c29e1a88b4e4698dffd9d932f9bd326df0f108d0eb749d51ac4742d750

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx/1.10.3
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range
Cache-Control
max-age=43226
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
1879
Expires
Mon, 16 Dec 2019 04:17:41 GMT
ads
securepubads.g.doubleclick.net/gampad/
389 B
387 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3082920281750274&correlator=4408269908208179&output=ldjh&impl=fifs&adsid=NT&eid=21062819%2C21062888&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191215&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3Db307b3d14cffddca649d7d38f3cc5922%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-4%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-1%252Cn107-1%252Cn21-1%252Cn51-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-0%252Cn9-0%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-4%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-0%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26amznbid%3D1%26amznp%3D1&cookie_enabled=1&bc=31&abxe=1&lmt=1576426635&dt=1576426635819&dlt=1576426635459&idt=267&frm=20&biw=1585&bih=1200&oid=3&adxs=393&adys=2855&adks=3874908706&ucis=1&ifi=1&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.golem.de%2F&dssz=34&icsg=539624443&std=0&csl=340&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x450&msz=1000x450&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&fws=0&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
8adf603a90ba742c3a11cf06980a2f2b0be4e6e0a728387d564de4474ce6f4b5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
202
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019121002.js
securepubads.g.doubleclick.net/gpt/
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

gx-ads.js
ads.golem.de/track.ads/
226 B
566 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=1429492840130914&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Wed, 15 Jan 2020 16:17:15 GMT
config.js
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
45 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.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
79a2e9bee80a87d2cce804c3e35f2badacdd081b3ed81a1d1e353981f6f2010a

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Age
2467
X-Cache
HIT
Connection
keep-alive
Content-Length
10462
x-amz-id-2
U+XNwt0cgAUd6xebTZngLzlyu+lKdckcPvJfpf1pWLMvIt6O+jZTaXtJiCSnCh0k1bw/ghotKFw=
X-Served-By
cache-hhn4076-HHN
Last-Modified
Sun, 15 Dec 2019 15:30:30 GMT
Server
AmazonS3
X-Timer
S1576426636.851814,VS0,VE0
ETag
"8ec5048654ab08153070259fee0f334a"
x-amz-request-id
5DCFC715F96330C8
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
95
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/
225 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
20cdda5f0e51f5dac5693ffe15fb394528dd838e9887a785de1d02e3bb2a418f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
86385
x-xss-protection
0
server
cafe
etag
4513681422076315165
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sun, 15 Dec 2019 16:17:15 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191205/r20190131/ Frame F6CD
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191205/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:814::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/r20191205/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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, 05 Dec 2019 17:33:14 GMT
expires
Thu, 19 Dec 2019 17:33:14 GMT
content-type
text/html; charset=UTF-8
etag
13309989325511048345
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6574
x-xss-protection
0
cache-control
public, max-age=1209600
age
859441
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
v1
dmx.districtm.io/b/
0
289 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
cf-cache-status
DYNAMIC
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin, Accept-Encoding
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
5459ba0a3ae7d6dd-FRA
access-control-allow-headers
origin, content-type
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
ads
securepubads.g.doubleclick.net/gampad/
58 KB
11 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3082920281750274&correlator=4408269908208179&output=ldjh&impl=fifs&adsid=NT&eid=21062819%2C21062888&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191215&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C1000x150%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17298.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17295.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17299.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cas%3Dbillboard2%26adslot%3Dbillboard2%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A18494.scenario%253Adefault%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17300.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3Db307b3d14cffddca649d7d38f3cc5922%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-4%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-1%252Cn107-1%252Cn21-1%252Cn51-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-0%252Cn9-0%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-4%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-0%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1576426635&dt=1576426635883&dlt=1576426635459&idt=267&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C1138&adys=0%2C130%2C748%2C1318%2C3967&adks=2242890686%2C1956608835%2C2740773112%2C366944190%2C2251274322&ucis=2%7C3%7C4%7C5%7C6&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.golem.de%2F&dssz=38&icsg=180432670700&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x12&msz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x10&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&fws=0%2C0%2C0%2C0%2C0&ohw=0%2C0%2C0%2C0%2C0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
2d04a4f51c4bf994aeb8d7f06f0a744b3127996f8149aabb034e960712cefb54
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-2,-2,-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10662
x-xss-protection
0
google-lineitem-id
5219817727,5219817727,5194673165,4980490284,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138294008015,138294008012,138290413938,138263655552,138267872671
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&i3=000fbda6dce7542605df65c8b%3A1604247435906%3A1576426635906%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576426635906&n1=2&dntt=0&lt=1576426635907&ev=&cs=vet2z1&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0025
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Redirect headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
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
Sun, 15 Dec 2019 16:17:15 GMT
Server
nginx
Location
/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000fbda6dce7542605df65c8b&ep=1599362357&vr=415&id=sxnjyl&i3=000fbda6dce7542605df65c8b%3A1604247435906%3A1576426635906%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576426635906&n1=2&dntt=0&lt=1576426635907&ev=&cs=vet2z1&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sat, 15 Dec 2018 16:17:15 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
72 KB
27 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
116.203.212.0 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.0.212.203.116.clients.your-server.de
Software
nginx /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:31:59 GMT
Server
nginx
ETag
W/"5c7d1abf-11e36"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Wed, 27 Nov 2019 10:54:39 GMT
js
www.googletagmanager.com/gtag/
73 KB
27 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
0c39c021ffc08f13cc0f38f80996cc76081317c2ef84c217904b9d7fa7244feb
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:15 GMT
content-encoding
br
last-modified
Sun, 15 Dec 2019 15:00:00 GMT
server
Google Tag Manager
access-control-allow-origin
http://www.googletagmanager.com
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
content-length
27812
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:15 GMT
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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2057:ee00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 14 Dec 2019 20:40:43 GMT
via
1.1 35c75b7f0ca8c787d67c8ebd22bc7fc3.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
88488
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
F3qIPlfrQLn3vrQgjQtpEy2OEF2nW3J8jfoucFLDsKxY1opd8k6EJw==
ping
account.golem.de/
0
0
Script
General
Full URL
https://account.golem.de/ping?callback=jQuery224041034047473429625_1576426635785&_=1576426635786
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:180 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

access-control-allow-origin
*
Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:15 GMT
Cache-Control
private, no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
-1
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:15 GMT
the-witcher-final-trailer.jpg
video.golem.de/teaser/1/1/23881/thumb-high-1000/
45 KB
46 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23881/thumb-high-1000/the-witcher-final-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
66897ca9d1cc150fb7ea4f792ab1ad7f3eb3ddf38855cee5e05d4c0cd04240ae

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 08:53:23 GMT
Server
nginx
ETag
"5df35183-b4cf"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
46287
Expires
Wed, 15 Jan 2020 16:17:15 GMT
silenthill-snap.jpg
video.golem.de/teaser/1/1/23856/thumb-high-1000/
199 KB
199 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23856/thumb-high-1000/silenthill-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f10e77f7cd0e88fdde30ebe9e5daeb88871e150210ca8132bdfcbc7326b7f3e6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 09 Dec 2019 07:23:55 GMT
Server
nginx
ETag
"5dedf68b-31a24"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
203300
Expires
Wed, 15 Jan 2020 16:17:15 GMT
teardown-spiel-mit-voxelgrafik-zerstoerbarer-umgebung-und-raytracing.jpg
video.golem.de/teaser/1/1/23861/thumb-high-1000/
80 KB
80 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23861/thumb-high-1000/teardown-spiel-mit-voxelgrafik-zerstoerbarer-umgebung-und-raytracing.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
589250dba43180fe0cf7501aba948265021df9e22aa1fb7c8730cbb9103311d2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Tue, 10 Dec 2019 08:15:19 GMT
Server
nginx
ETag
"5def5417-13e92"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
81554
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145523-216906-216903_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145523-216906-216903_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8535832aa4696ad21b220e2c3a07d6ea9c684c6b6010bbf3d2def08dd0bdff74

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 06:50:03 GMT
Server
nginx
ETag
"5df3349b-1a65"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6757
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145365-216303-216299_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145365-216303-216299_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac7fae2fe6377c7cddce54bd395f0b9987c87e384063bf634cff71ba3836e43a

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 11:04:03 GMT
Server
nginx
ETag
"5df37023-2606"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9734
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145546-217026-217023_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145546-217026-217023_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bf6f4af4d79873f3116f2c0a5748d3087ac4a597af9252c6d85812b1de9c8d08

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sat, 14 Dec 2019 13:08:03 GMT
Server
nginx
ETag
"5df4deb3-1d3f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7487
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145545-217022-217018_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145545-217022-217018_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7e77822c147ce432c499957247ba93ded69a76db2da5a1f9e69e80ccc0cabef5

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sat, 14 Dec 2019 12:22:03 GMT
Server
nginx
ETag
"5df4d3eb-1f45"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8005
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145544-217016-217013_rc.jpg
www.golem.de/1912/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145544-217016-217013_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6bff714e860bae55ddf8c9f6a4c8bea6ce2ef3baed5c92894d620e80524c9b04

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Sat, 14 Dec 2019 11:39:03 GMT
Server
nginx
ETag
"5df4c9d7-193d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6461
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145340-216442-216441_rc.jpg
www.golem.de/1912/
71 KB
72 KB
Image
General
Full URL
https://www.golem.de/1912/145340-216442-216441_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
70fcf08edf288ef450875f11d5cbd711804a9e2c20cd1d3190bfa38840e993be

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Mon, 09 Dec 2019 11:01:03 GMT
Server
nginx
ETag
"5dee296f-11deb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
73195
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145065-216889-216885_rc.jpg
www.golem.de/1912/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145065-216889-216885_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
60c81aea75fd199e87f233a36df752810228f969d02eb34aa7fa1ed06c30371c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 09:45:04 GMT
Server
nginx
ETag
"5df35da0-2221"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8737
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145542-217007-217004_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145542-217007-217004_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f9bf008e0c39cf80db2028fccb95b9fd00f0c8472d67078c26187f883e0f654d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 17:10:03 GMT
Server
nginx
ETag
"5df3c5eb-1ec9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7881
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145541-216995-216992_rc.jpg
www.golem.de/1912/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1912/145541-216995-216992_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b1c45061e8e418105a0602f7400fc1253b9855f7c0e1cac9350631066b3674f4

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 15:56:03 GMT
Server
nginx
ETag
"5df3b493-1812"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6162
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145540-216991-216988_rc.jpg
www.golem.de/1912/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1912/145540-216991-216988_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b1f87d39e9bd6300b2589f2944896dac8e8d11837f125769bd8a986ec60e554d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 14:32:03 GMT
Server
nginx
ETag
"5df3a0e3-e3f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3647
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145539-216984-216983_rc.jpg
www.golem.de/1912/
12 KB
13 KB
Image
General
Full URL
https://www.golem.de/1912/145539-216984-216983_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ed035713f167c05eff55881c34d3b7c01ec9888c532c21e78611996e3c60320f

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 13:52:04 GMT
Server
nginx
ETag
"5df39784-3113"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
12563
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145538-216982-216979_rc.jpg
www.golem.de/1912/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145538-216982-216979_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8ad8558f5a3ddc33e15d7664301ad96c4affb90c9d34a0051e811a6cdb1131b3

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 13:00:03 GMT
Server
nginx
ETag
"5df38b53-24b6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9398
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145536-216978-216975_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145536-216978-216975_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a968852406a7f5c2a6be7edc5a5831d1fe64ebcaf75e4d201f7f94948af4ef31

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:15 GMT
Last-Modified
Fri, 13 Dec 2019 12:26:03 GMT
Server
nginx
ETag
"5df3835b-1d83"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7555
Expires
Wed, 15 Jan 2020 16:17:15 GMT
145537-216974-216971_rc.jpg
www.golem.de/1912/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145537-216974-216971_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
68e5d05a49f87de307f65935943c6496630fb3451a54b9f96b7773fb8555480a

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 12:01:03 GMT
Server
nginx
ETag
"5df37d7f-19dc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6620
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145534-216960-216957_rc.jpg
www.golem.de/1912/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1912/145534-216960-216957_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
df8bb9194111b87c1ee8e768cb13c03b9da9fa91977481715a7b865c8f10a3e6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 11:15:03 GMT
Server
nginx
ETag
"5df372b7-10ee"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4334
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145533-216951-216948_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145533-216951-216948_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
88e489a2781814dbbd65e02b744b8c42ff0e87db3c9abf8f83a39596efe1c9ea

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 10:52:04 GMT
Server
nginx
ETag
"5df36d54-1a76"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6774
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145532-216956-216953_rc.jpg
www.golem.de/1912/
10 KB
11 KB
Image
General
Full URL
https://www.golem.de/1912/145532-216956-216953_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
068309afad0bc76aec38630128c3d19822b5ade7bd397b437a3de0ad9c298e3c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 10:45:04 GMT
Server
nginx
ETag
"5df36bb0-299b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10651
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145530-216947-216942_rc.jpg
www.golem.de/1912/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145530-216947-216942_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a3ddf4d7132ad7c72948e5b3e40f7987c392b45484dd251877ec1bb9b817dbbb

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 09:44:03 GMT
Server
nginx
ETag
"5df35d63-2168"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8552
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145529-216936-216933_rc.jpg
www.golem.de/1912/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145529-216936-216933_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
da80fcfbcf129186f8d0d5c642408ec15e31641e6e4d95e1adfa9062cb40a07e

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 09:00:03 GMT
Server
nginx
ETag
"5df35313-2450"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9296
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145528-216932-216931_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145528-216932-216931_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
02867c96fed3edca2ab6693646ff6cb5be5a17603e5cd4e51d6243df31db3c75

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 08:40:03 GMT
Server
nginx
ETag
"5df34e63-27a9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10153
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145525-216916-216911_rc.jpg
www.golem.de/1912/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145525-216916-216911_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
51ebfcf39139ee35d534772985bbd3a55c69ad495d55f766c64c32d7ae922221

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 07:55:03 GMT
Server
nginx
ETag
"5df343d7-2446"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9286
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145524-216910-216907_rc.jpg
www.golem.de/1912/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1912/145524-216910-216907_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7654775a53d60ca555f70b048aeda0be21eff9d2cb8d6893a56cdb876a5fe26d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 07:41:03 GMT
Server
nginx
ETag
"5df3408f-f55"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3925
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145527-216927-216926_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145527-216927-216926_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e0b7e91ff505bfbbaba551bdd84169bcee03bad0f7ce6d4ff4352fccf648cc24

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 07:13:03 GMT
Server
nginx
ETag
"5df339ff-1e01"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7681
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145383-216690-216689_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145383-216690-216689_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bba2172b72e9ccdf95e8960fec90943767eea660946a8f534a8bd61776bcfa6e

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Wed, 11 Dec 2019 11:03:04 GMT
Server
nginx
ETag
"5df0cce8-1f5b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8027
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145493-216766-216762_rc.jpg
www.golem.de/1912/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145493-216766-216762_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5162ff00b4d08ed6f2cd8491940c2cf233531d81a9e0be3cb91fa51b07d90c9f

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Thu, 12 Dec 2019 11:05:04 GMT
Server
nginx
ETag
"5df21ee0-2286"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8838
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145495-216783-216779_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145495-216783-216779_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
70fcc9475d77c50d773547b426bbffd94094b86aba92e0e8da917fb01395a6c8

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Thu, 12 Dec 2019 14:00:03 GMT
Server
nginx
ETag
"5df247e3-1e53"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7763
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145522-216902-216899_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145522-216902-216899_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
934dbcf518caacaaf31c3149b93828d85661d2b706cd85a8763c0a4637c5468e

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 13 Dec 2019 06:32:04 GMT
Server
nginx
ETag
"5df33064-272c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10028
Expires
Wed, 15 Jan 2020 16:17:16 GMT
145440-216560-216559_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145440-216560-216559_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2a6af145b40cb0465f1b8be0af43049fce3942493450dca255cddaf80eab6ed6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Wed, 11 Dec 2019 07:55:04 GMT
Server
nginx
ETag
"5df0a0d8-1dce"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7630
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145399-216510-216508_rc.jpg
www.golem.de/1912/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145399-216510-216508_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d4d2956a2b4f4e52d5d5a78b038aa3586bca0788f89924e2a0c3ffd61e3a2765

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 10 Dec 2019 06:00:04 GMT
Server
nginx
ETag
"5def3464-5260"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21088
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145382-216752-216750_rc.jpg
www.golem.de/1912/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145382-216752-216750_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6bb4ed6f0ab117491217d63a3e7292fe41d9950d0eb015c0c39a56cf0cf07d10

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Thu, 12 Dec 2019 08:23:04 GMT
Server
nginx
ETag
"5df1f8e8-459b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17819
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145435-216482-216480_rc.jpg
www.golem.de/1912/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145435-216482-216480_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
921d2930dec16635e5b3efee4f21844bc10b8f42f81abb0b89589e9ab8b73b33

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 10 Dec 2019 11:04:05 GMT
Server
nginx
ETag
"5def7ba5-5f71"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24433
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145355-216195-216193_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145355-216195-216193_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
64484f3feac9b54f1e55dd2f98213eeeba00cb8372b5172615239f554577d3b2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Thu, 05 Dec 2019 11:12:04 GMT
Server
nginx
ETag
"5de8e604-2767"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10087
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145198-215292-215290_rc.jpg
www.golem.de/1912/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145198-215292-215290_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7207dcdc68b43142844cfef7d74159fa32f94650d5f116272fb3fe19f56b5ff7

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 10 Dec 2019 08:04:04 GMT
Server
nginx
ETag
"5def5174-7478"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29816
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145446-216519-216517_rc.jpg
www.golem.de/1912/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145446-216519-216517_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
66139eb6b84d9595b190aef89ed6775c83d0335bba775ce91459f2975b3bba6b

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 10 Dec 2019 07:00:04 GMT
Server
nginx
ETag
"5def4274-5167"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20839
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145308-215882-215880_rc.jpg
www.golem.de/1912/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145308-215882-215880_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
38ed0453588e6faede50753a35ff2d7305a71b3e5ef473a0201ec155191acc97

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 06 Dec 2019 08:23:04 GMT
Server
nginx
ETag
"5dea0fe8-5c9a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23706
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145178-216079-216077_rc.jpg
www.golem.de/1912/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145178-216079-216077_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9349c4888e6869354d44dad059fce0b84b8286d918fad03cb65a8438f22a47c6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Wed, 04 Dec 2019 12:58:04 GMT
Server
nginx
ETag
"5de7ad5c-3f68"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16232
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145397-216306-216304_rc.jpg
www.golem.de/1912/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145397-216306-216304_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
417f460fcc19ed1da2620db6953d7e7d84a5f483a1db5629ee9b523698a99bad

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Fri, 06 Dec 2019 11:14:05 GMT
Server
nginx
ETag
"5dea37fd-5a40"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23104
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145107-215859-215857_rc.jpg
www.golem.de/1912/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145107-215859-215857_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
823e42aa2d4afb9433ad1a11cc65d4f756e259634370a943537d4a1ba63d6f6f

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Wed, 04 Dec 2019 06:33:04 GMT
Server
nginx
ETag
"5de75320-5283"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21123
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145222-215398-215396_rc.jpg
www.golem.de/1912/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145222-215398-215396_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
01bcbcdf86b3d25bb9b196527572bbf7fd3b22a554eca2bdf6a2d4a7a46f38da

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 03 Dec 2019 14:53:04 GMT
Server
nginx
ETag
"5de676d0-49b5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18869
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_144709-212917-212915_rc.jpg
www.golem.de/1912/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1912/sp_144709-212917-212915_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5ce279e333e2753579e8ffe45a41228f2222a54b123997c42b661fe8cb80b907

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 03 Dec 2019 11:01:04 GMT
Server
nginx
ETag
"5de64070-674a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26442
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145320-215924-215920_rc.jpg
www.golem.de/1912/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145320-215924-215920_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
64f594daaa982f06872c43c318e2e7a764acaabb1fa7e7b166f5aecfb2e39279

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Wed, 04 Dec 2019 10:05:05 GMT
Server
nginx
ETag
"5de784d1-3e92"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16018
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_144885-215854-215852_rc.jpg
www.golem.de/1912/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1912/sp_144885-215854-215852_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
52853f171b1c2bdd6fc7fd093442f6b9b07b2d1a975671a4c81f17b06b35dcd2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 02 Dec 2019 11:33:04 GMT
Server
nginx
ETag
"5de4f670-433d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17213
Expires
Wed, 15 Jan 2020 16:17:16 GMT
sp_145264-215657-215655_rc.jpg
www.golem.de/1912/
21 KB
22 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145264-215657-215655_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f62a0b06cac8f6d9fc14e97bd292a2863e45f79b505bb3c67cbd2ea042f27564

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 02 Dec 2019 06:58:04 GMT
Server
nginx
ETag
"5de4b5fc-556f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21871
Expires
Wed, 15 Jan 2020 16:17:16 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1576426636&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

X-Cnection
close
Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Sun, 15 Dec 2019 16:17:16 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n116=0&n104=0&n15=1&n155=1&n106=1&n52=2&n153=1&n11=1&n120=2&n154=1&n125=1&n8=4&n137=0&n101=1&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=1&n160=1&n107=1&n21=1&n51=1&n117=2&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=1&n126=0&n92=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=0&n20=1&n80=0&n12=6&n141=0&n157=1&n99=1&n128=2&n118=6&n85=0&n9=0&n6=2&n63=0&n58=1&n38=2&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=3&n90=1&n43=1&n142=0&n7=4&n103=0&n158=1&n124=1&n75=0&n91=0&n46=1&n114=1&n69=0&n10=2&n3=1&n82=1&n33=1&n84=0&n5=5&n109=0&n122=1&n67=0&n115=1&n89=2&n123=2&n17=1&n78=0&n81=1&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.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e2283cc6375315dd87743feff83d9f48424933159f87e35215eb859acc3c11a6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1516
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201912111527/
31 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201912111527/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/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
610f7772eaba86e5daa5311a03ad90fce900deb1cf93453334100640d90bd5e2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Age
772
X-Cache
HIT
Connection
keep-alive
Content-Length
11563
x-amz-id-2
mxBuLkOGQpLhuNtVy+seQtLkJr83f7mKrIR9pAB4QQDTx0i4VPQ/tvWaWEyFOkXJmaVUFq1aeyc=
X-Served-By
cache-hhn4076-HHN
Last-Modified
Thu, 12 Dec 2019 15:48:13 GMT
Server
AmazonS3
X-Timer
S1576426636.036273,VS0,VE0
ETag
"da73881f5b9af91d074c623ce31000ca"
x-amz-request-id
BB286E61B541EB84
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
1613
ads
googleads.g.doubleclick.net/pagead/ Frame 326B
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576426635&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635840&bpp=8&bdt=381&fdt=130&idt=130&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=6980513374539&frm=20&pv=2&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&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=293&ady=3986&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&btvi=1&fsb=1&xpc=3I25a4iRF8&p=https%3A//www.golem.de&dtd=141
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - 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-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576426635&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635840&bpp=8&bdt=381&fdt=130&idt=130&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=6980513374539&frm=20&pv=2&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&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=293&ady=3986&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&btvi=1&fsb=1&xpc=3I25a4iRF8&p=https%3A//www.golem.de&dtd=141
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 15 Dec 2019 16:17:16 GMT
server
cafe
content-length
25736
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Sun, 15-Dec-2019 16:32:16 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Sun, 15 Dec 2019 16:17:16 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/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
63890326f558587b0840eb0a6e6377f1bf39264e015e568f4c2a03aefce3f929
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29463
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
sp_PqIgzS-153981_rc.jpg
www.golem.de/1610/
68 B
463 B
Image
General
Full URL
https://www.golem.de/1610/sp_PqIgzS-153981_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
rmpslider-rl_133-min.js
www.golem.de/staticrl/scripts/radiant/
21 KB
9 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:16 GMT
robomaster-snap.jpg
video.golem.de/teaser/1/1/23863/thumb-high-1000/
117 KB
118 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23863/thumb-high-1000/robomaster-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7d5baa33638e65cc2670d043eed681e1177668157627cce4087ced9911919009

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Tue, 10 Dec 2019 13:51:34 GMT
Server
nginx
ETag
"5defa2e6-1d564"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
120164
Expires
Wed, 15 Jan 2020 16:17:16 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:e93746574.794e9dda5_1576426636038,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1576426636042
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=15&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=e93746574.794e9dda5_1576426636038&1576426636043
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:e93746574.794e9dda5_1576426636038,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=e93746574.794e9dda5_1576426636038&1576426636045
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:e93746574.794e9dda5_1576426636038,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1576426636046
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 6284
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576426636&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635848&bpp=5&bdt=389&fdt=199&idt=199&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&dssz=55&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=293&ady=4707&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&btvi=2&fsb=1&xpc=515Gvsi2D5&p=https%3A//www.golem.de&dtd=203
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - 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-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576426636&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576426635848&bpp=5&bdt=389&fdt=199&idt=199&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=739052202752768&dssz=55&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=293&ady=4707&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&btvi=2&fsb=1&xpc=515Gvsi2D5&p=https%3A//www.golem.de&dtd=203
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 15 Dec 2019 16:17:16 GMT
server
cafe
content-length
25736
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Sun, 15-Dec-2019 16:32:16 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Sun, 15 Dec 2019 16:17:16 GMT
cache-control
private
/
d.agkn.com/iframe/8613/ Frame 32C4
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=822190710&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2057:4800:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=822190710&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%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
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
482
cache-control
no-cache, must-revalidate
date
Sun, 15 Dec 2019 16:17:15 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%3AasFkQV2ZXwysHs44yLH4WIROk4SLN4qE;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAliRkMJYkZDAAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
x-cache
Miss from cloudfront
via
1.1 163be08bc1bc44818353c4fd88655bee.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA6-C1
x-amz-cf-id
GODN-QpI9a9chO5kWXmtkWuDPMhHuKs0EbkLa9PIrX7UXEa295xEQA==
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
701 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.217.36.102 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
E9F1163FAF0F6EA7
Content-Length
53
x-amz-id-2
UITywoONYCEEsOtPXZ89DSuOOPlRHoOzIsL7n+pdS32arf/MNJV5dv5rWPo36t0kO7HsK8n78Tk=
Last-Modified
Sat, 14 Dec 2019 17:45:23 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Thu, 14 Nov 2019 17:36:22 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:16 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.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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
6219
date
Sun, 15 Dec 2019 14:33:37 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Sun, 15 Dec 2019 16:33:37 GMT
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
796
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
795
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
794
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
793
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b307b3d14cffddca649d7d38f3cc5922&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db307b3d14cffddca649d7d38f3cc5922%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b307b3d14cffddca649d7d38f3cc5922&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db307b3d14cffddca649d7d38f3cc5922%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b307b3d14cffddca649d7d38f3cc5922&userId=adscale-user:686a192e403f4ad69c827210cb107502
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b307b3d14cffddca649d7d38f3cc5922&userId=adscale-user:686a192e403f4ad69c827210cb107502
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b307b3d14cffddca649d7d38f3cc5922&userId=adscale-user:686a192e403f4ad69c827210cb107502
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Sun, 15 Dec 2019 16:17:16 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=b307b3d14cffddca649d7d38f3cc5922
43 B
1011 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=b307b3d14cffddca649d7d38f3cc5922
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:18 GMT
AN-X-Request-Uuid
a4c4c1b4-9d7f-4644-9c3b-6984da286f3f
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.56:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=b307b3d14cffddca649d7d38f3cc5922
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swez0Uz_3cpknX0488xZIg
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swez0Uz_3cpknX0488xZIg&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:16 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=b307b3d14cffddca649d7d38f3cc5922
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=b307b3d14cffddca649d7d38f3cc5922
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.108.37.125 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-37-125.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
x-frame-options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
x-xss-protection
1; mode=block
x-application-context
application
Expires
Sat, 14 Dec 2019 16:17:16 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=b307b3d14cffddca649d7d38f3cc5922
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
ads
googleads.g.doubleclick.net/pagead/ Frame 9FDD
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1576426636&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1576426635943&bpp=3&bdt=484&fdt=184&idt=184&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=184763050883840&dssz=55&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&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=6&uci=a!6&fsb=1&dtd=190
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - 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-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1576426636&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1576426635943&bpp=3&bdt=484&fdt=184&idt=184&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=6980513374539&frm=20&pv=1&ga_vid=603523472.1576426636&ga_sid=1576426636&ga_hid=1610231706&ga_fc=0&iag=0&icsg=184763050883840&dssz=55&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126%2C21065274&oid=3&pvsid=3082920281750274&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=6&uci=a!6&fsb=1&dtd=190
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 15 Dec 2019 16:17:16 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT IDE=AHWqTUlPeSRWZQhYe9lEouNI4oa3ykXxpcRyQUY3cK3M5wBHqC8dBN1OMn_uViN4; expires=Fri, 08-Jan-2021 16:17:16 GMT; path=/; domain=.doubleclick.net; HttpOnly
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Sun, 15 Dec 2019 16:17:16 GMT
cache-control
private
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1610231706&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=603523472.1576426636&jid=2039176703&_gid=144682408.1576426636&gjid=671966902&_v=j79&z=1997919453
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=603523472.1576426636&jid=2039176703&_gid=144682408.1576426636&gjid=671966902&_v=j79&z=1997919453
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c00::9a Brussels, Belgium, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:16 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=603523472.1576426636&jid=2039176703&_gid=144682408.1576426636&gjid=671966902&_v=j79&z=1997919453
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
415
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1610231706&t=timing&_s=2&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&utc=JS%20Dependencies&utv=load&utt=629&_u=IAhAAUAB~&jid=&gjid=&cid=603523472.1576426636&tid=UA-518800-2&_gid=144682408.1576426636&gtm=2ouc61&z=1160198991
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 21 Nov 2019 17:38:11 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2068745
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
1000 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Via
1.1 61adf71a363fe0f836dc69dbb43de824.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA53-C1
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
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
qbNjQVE8aeCpq-FtMCBMqlVplaNhWXTGkN_vUYtSi2Ke3esjOqT_NQ==
Expires
0
sp_PqIgzS-811915_rc.jpg
www.golem.de/3212/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/3212/ad-time/sp_PqIgzS-811915_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
sp_PqIgzS-808157_rc.jpg
www.golem.de/7934/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/7934/ad-time/sp_PqIgzS-808157_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
6 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=437896
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:3cd , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
6fba68ac9345123605b8512151a8120eb95780ca36f1edb74c910d3683066794
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
989
cf-ray
5459ba0cacc859f4-VIE
status
200
last-modified
Wed, 11 Dec 2019 11:57:27 GMT
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/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=3600
timing-allow-origin
*
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Sun, 15 Dec 2019 17:17:16 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 15 Jan 2020 16:17:16 GMT
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
ima3.js
imasdk.googleapis.com/js/sdkloader/
267 KB
91 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
918c4485a28931feb333074355c2f4c2e915ffa51fe70b8797e9432c37b22b8f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
92690
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

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

Response headers

Content-Type
image/png
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

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

Response headers

Content-Type
image/png
truncated
/
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

Request headers

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

Response headers

Content-Type
image/png
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Wed, 15 Jan 2020 16:17:16 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Wed, 15 Jan 2020 16:17:16 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=e93746574.794e9dda5_1576426636038&1576426636317
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
bridge3.355.3_de.html
imasdk.googleapis.com/js/core/ Frame 5C0F
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.355.3_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200a 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
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.355.3_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
196471
date
Fri, 13 Dec 2019 22:31:39 GMT
expires
Sat, 12 Dec 2020 22:31:39 GMT
last-modified
Tue, 10 Dec 2019 22:57:51 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
150337
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
client.js
s0.2mdn.net/instream/video/
26 KB
10 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 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
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10523
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-44b"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Wed, 15 Jan 2020 16:17:16 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-39c"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Wed, 15 Jan 2020 16:17:16 GMT
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.210.249.210 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-210.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
9wmXmJRzbqUN1J_FE3OdLbfoYkoSRNk9
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 21:27:04 GMT
Server
AmazonS3
x-amz-request-id
176ED065FC3E7D9A
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 15 Dec 2019 16:17:16 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
0rcOEwYJV9RQqFQ4Qb4Mr7/BRxeeL9GU0j2j9+AafU+a+XimIF7qRDQ21dSfjt3fr5S3grUBGIE=
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=99547115
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.110 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 18:48:04 GMT
server
nginx
etag
W/"5dcafe64-9d2b"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Sun, 15 Dec 2019 16:22:16 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.30 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn3.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:16 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
Sat, 21 Dec 2019 22:00:04 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 15 Dec 2019 16:17:16 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1687
content-type
text/javascript
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
581 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=86846921&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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:16 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
Cookie set map
ih.adscale.de/ Frame 336F
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.210.249.210 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-210.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/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
ng=2#3439356403#26273777#0#d7~1&d10~4&d4~6&d11~0&d8~2&d9~4&d12~2&d1~1&d3~5; uu=686a192e403f4ad69c827210cb107502; tu=4#4087176260#48~b307b3d14cffddca649d7d38f3cc5922~437896~0~0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Sun, 15 Dec 2019 16:17:16 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Content-Length
652
Connection
keep-alive
Set-Cookie
tu=4#3146185160#48~b307b3d14cffddca649d7d38f3cc5922~437896~0~0#101~~437896~437896~1#38~~437896~437896~1#72~~437896~437896~1#42~~437896~437896~1#75~~437896~437896~1#60~~437896~437896~1#108~~437896~437896~1#63~~437896~437896~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
hd-main.js
hgc-cf-cache-1.svonm.com/
195 KB
57 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=ihnDmWRtky
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA53-C1
Transfer-Encoding
chunked
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://www.golem.de
Last-Modified
Tue, 10 Dec 2019 10:44:16 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 61adf71a363fe0f836dc69dbb43de824.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Id
UDBA57S1VXhxB1WliLwv2nxiNCqFnp2ckJVrReihoI96n_EKuFseCA==
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.121 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 15 Dec 2019 16:17:16 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:2057:5c00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 19:21:49 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
5950528
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
FRA6-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
jcroQZ6gPNZ9UowY2HrPjGA4X2cj1kTJamht_MC7bFNkQCEQGIwH8w==
via
1.1 f2ee8ec5deee40e44013272a9c7aa35c.cloudfront.net (CloudFront)
view
securepubads.g.doubleclick.net/pcs/ Frame 57F1
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst4nO9P_njx2WF4mF5na217vcuBb1pWRPeo6r114v55lsFPd0_tb8Z3Vn8H0aBwGG4vPbA4I9W6jedkAV59FohvUv3WoV4wJk2SIg41QFhOxJyjv3VsGAd3UBWndhw_wHa4YdSB7Wj_P925j1U39FZ5Ig8VD7kuEBkaoCQ4z6Rul9gp2edBAn4ofrO20Lq9fG6vr9DMXSSK8ctGpw1yC0jRwboJ_zGfPsNky6xlIGXZ9KGr90d8u2zk8HHDYfoLHAhhmAckT317FO0XIQwunkQ0V0wZL0i7ZZokajTwF5VLfQj5-GXI02sLd89o2Lx30Sk2xw&sai=AMfl-YT6TrUZK5_U5d4C4JD1gXGDfpjLwDoILbZPrw7OPVlLGj2Kb6mTf-_Xx8WB4pP041kihy4QSB4ORzMA4PubexGn4WMNPeha8c69xEG59Q&sig=Cg0ArKJSzGG90UI33KqiEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 57F1
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3FC7
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstDsRd4ljAgvPiP2E3qDs0PYa0Dq5IE3a7LZdEYivsQwtsW0y1szH-p54v5QYZyqKJ3KrYxsqDRqrRJ6r-mkPFpLinCs_ycBJ5jm2NPd4uoP-EUrKdGVav1ammXLjDUgXe7jS_TimQE6mlzFpS_g6eB_isKm633n8cCjqLny2hWTdj5fqC7EMNLC8BZ6TXFKRu7UN85yn-oo3ziEmFlnQJarzQ3OB9RMvfDcm8DG70dQoyiLjRDQ08TNKToRqEyw9PJDASCT3hIz3lLhuvus8Pz4Ux7BKRX0KbjNe3AlZ74EmD7plPglMsFst-4FCUZSZ7WKA&sai=AMfl-YSoIQv8pbhsS9hXez487OGd4xuaNxw7bNZsvCzHNvs0Qe70VTpWHrT_2u-WdCZXZBnuuHdJI29o-_II2rPAujWUVt7cyThThPlsMVvXAw&sig=Cg0ArKJSzJ7CzGqunZBnEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
Cookie set banner
adfarm1.adition.com/ Frame DC68
0
0
Document
General
Full URL
https://adfarm1.adition.com/banner?sid=4399261&kid=3386627&wpt=H&ts=844912697&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsvSTmzNYcfzKrgkR1C0niRSLgmjcYHkHcas90lRA5booo4mTFHDYMOY2BZBtoDoRupQzXFezAQfpeYOGqg2qBV7lYptGkoRrxJ3nbFRIcccRF0PZyRinDILIsEDMxgB227gQZT41JhF0RHQ0Hbuny8tCuHldG2gmDQmTrauHU0p9XRqp9ooY6kBMFWi20yw59OBnLc5H2G_9kKdzdL_Za8N2r5gXuOfRzpUkwlez5gewk7wDQUOBQHaRRmam3I3NyHnydXtZWHDq52mGthz2UCu&sai=AMfl-YR9Xcq9PAaaqpHI0ybZRrra-e0mLCJ7hbgTfC2UfFh6i_Vi8DGBL0gfrjJo88CLky7irhKyeHtdiJsNzYRrTw7OOiLXgfVGJzbhFGPJMw&sig=Cg0ArKJSzJM7InWsycVWEAE&urlfix=1&adurl=[url_plain]
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.8 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
adfarm1.adition.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Sun, 15 Dec 2019 17:17:16 +0100
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6770700846185448653; expires=Fri, 12-Jun-2020 17:17:16 GMT; path=/; domain=.adfarm1.adition.com; SameSite=None; Secure
Content-Encoding
gzip
Cookie set banner
adfarm1.adition.com/ Frame F076
0
0
Document
General
Full URL
https://adfarm1.adition.com/banner?sid=4399236&kid=3386627&wpt=H&ts=844912697&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsvSTmzNYcfzKrgkR1C0niRSLgmjcYHkHcas90lRA5booo4mTFHDYMOY2BZBtoDoRupQzXFezAQfpeYOGqg2qBV7lYptGkoRrxJ3nbFRIcccRF0PZyRinDILIsEDMxgB227gQZT41JhF0RHQ0Hbuny8tCuHldG2gmDQmTrauHU0p9XRqp9ooY6kBMFWi20yw59OBnLc5H2G_9kKdzdL_Za8N2r5gXuOfRzpUkwlez5gewk7wDQUOBQHaRRmam3I3NyHnydXtZWHDq52mGthz2UCu&sai=AMfl-YR9Xcq9PAaaqpHI0ybZRrra-e0mLCJ7hbgTfC2UfFh6i_Vi8DGBL0gfrjJo88CLky7irhKyeHtdiJsNzYRrTw7OOiLXgfVGJzbhFGPJMw&sig=Cg0ArKJSzJM7InWsycVWEAE&urlfix=1&adurl=[url_plain]
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.8 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
adfarm1.adition.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Sun, 15 Dec 2019 17:17:16 +0100
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6770700846185710797; expires=Fri, 12-Jun-2020 17:17:16 GMT; path=/; domain=.adfarm1.adition.com; SameSite=None; Secure
Content-Encoding
gzip
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3FC7
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 2112
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuOrPXoVPjA_8CY0vLxPomZIA3cPmTwLlcsLvJgCZmID1emlnBUdomNEs1j_yFfAsK7mDEBXJPPaufskLY4y9iv3LqUlcBFwS8Lg2FESYg-P6_YHgRASxdrqCczXt0U0hLEI-w5UwQae311Nos-lZDqx9Fp80Sjf7Yu4AqawBCAfL49LYrpI-HtglgUGV8bMpvD2FG2Ka_n2nkRIiBVIEMHEs3Six1EDpE8kTcA1TgPIX0r2hlfFMyMaUzlOfn2wX7yqtIfxXW1c175M6nuj7RY&sai=AMfl-YTzRQHdOffHh1sAgbwAZg_eCZuL-bpUIthvhXz0aEhK6WqhmNMC4XfMYhyUSXZ4dtCCRv2eg0T05vfD_aBb6SdonTAHfoQHmRQwv6jbDQ&sig=Cg0ArKJSzCXBra9ZRzSmEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2112
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
imgad
tpc.googlesyndication.com/pagead/ Frame 2112
24 KB
25 KB
Image
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDnm4Oh2QEQARgBMgitfI9gey4F2g
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 12 Dec 2019 11:22:02 GMT
x-content-type-options
nosniff
server
cafe
age
276914
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
public, max-age=604800
content-type
image/jpeg
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24989
x-xss-protection
0
expires
Thu, 19 Dec 2019 11:22:02 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 1FE3
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuDh5ZK-TBQ0L2ILRzRk5XW9OWH-zInSNoa1vWgVX8hJN_tRGaCy1S9_cfcm-pMzF2elCeLCruWwXuN5Wvb8p-f43gj0SPCmCXUK1Z6PDVWiT69-8VnmzAO51o0tmF5yLNDtASzKfl2FKG_jbe9Nwwo9PpONf7-hGtAVp11tVWWjiyKHlorQ1MG1wDkkVs54RXC-phFeJ5n6fY4bUzFiB6fBCMaXmW-c9VJfI35KHUifFSduXF0bI1uGTSrv-qMQ8KY8H_Wq5oZdhAjg0DMPH0zd3Nm&sai=AMfl-YSteAM9KphUEup6ox7ksrfV22RcH3JKbAuxdHtHtX60XPAxcdmYI8i5NLsp-ui-UYj0Uu_ZAWED4NCh1nqS7XBpdKfXVMqd_HaHrs4Gog&sig=Cg0ArKJSzD2-2ataBL46EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 1FE3
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"367 / 753 of 1000 / last-modified: 1576171782"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15846
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1FE3
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame BE59
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuFm2rw-4b---QZMTmKq2MtZqDjrEvByLmYthibpKxMp8Gie0TdPnjpaSC5r4jyK0Cjv37lSvZBxQ65MJbAild_2O3tywVjkLzk4fRdcxX5x-HHy3CWnTJPfSgKBJNMt6h0tJijRKdwcgA0x9nEl3AaVEEKXXjZYbaq_d0Iz2A9YhlxJp_kFOKIso68iT6LoXdY0Eqta0kdvp0y-ajZOcMUcMO_zro1h0TDQwzbHtUGZhaka5NgmPTuUB2owLqOcXpfaiKdPCFIxdtvs1kxz7TSCEf1&sai=AMfl-YTn1dpIII66sgvrQ9mnkPqgowq2Q8s5jhZIpuIm5JVoRhX3tZgoH6xL3VIvoZkZ2wJpjzAFD8JHjY35fy2AHWfnOIlabz5K1tjh3LsR6g&sig=Cg0ArKJSzPJvraL0iTDgEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 15 Dec 2019 16:17:16 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame BE59
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"367 / 687 of 1000 / last-modified: 1576171782"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15846
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame BE59
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
launcher.js
sak.userreport.com/sdm/
63 KB
20 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: nugmw.userreport.com
URL: https://nugmw.userreport.com/rc-ap/1fb996b1-427e-4f45-a207-528b7215e0ad/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.83 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-83.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
IMogK55qKO1IHLdYEtGgaDgCZp65LBVz
content-encoding
gzip
last-modified
Fri, 01 Nov 2019 09:56:54 GMT
server
AmazonS3
age
152
date
Sun, 15 Dec 2019 16:14:45 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=300
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
DzK1K9O05GmAPU_v7Q4bZ22nIb5sHralMbFjx5TYb-aPWMLVfDNfcg==
via
1.1 89cb19c6f2c9ed0983294d3b12e80e43.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=b307b3d14cffddca649d7d38f3cc5922&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=566899876406
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e709762e44e6d15baf9572e12b302e3d91d9a55a51cab10f1bf18e9ede2a9abe

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabDwQAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A32A0yA22Az1Ay4AwyA0zAu1Bz5Er4FkBF/k0FTEmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A2zA25Aw2A34AxmAjwFpkF9kElzFr0FvwFmhEwhF91AyxA54Ax3A3yA3mAjpFk9BxzA4yA50AwwA4wAxyAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA54Ax3A3yA3mAhwFk9B1yAx5A4xA33Ay3AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A0yA22Az2A30A4BELlnFBTkzF8PVEAAZAwSAcAAAAPUMAAAAAAABxCNAPBAAFAAxCNTrp0APBAAFAAxCNT/FkASksFnEjAAAAAAAAAAAAEAAAxCNAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFGA3yA44E5wAMAxzA4yA50AwwA4wAxyAGAkpFylFj0FAAAAKA02Az2A5wA23A4xAKA1yAx5A4xA33Ay3AGAihFuuFlyFKA1yAx5A4xA33Ay3AKA1yAx5A4xA33Ay3A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFQtjF/4OJUA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabExQAATkzF6PAAA/IAAAABrp0AZBAAOA55A55A85B55A58E55A55AFA1zA0yA1BErrp0ASksFvOd/IAAAAYLAaBAFAAArp0AAANJo0F0wFz6BvvAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF90Az5A5yA2xAmrEpkF9zAz4A22Ay3Am3Ew0F9IEm0Ez9B40A05AxyA25A3mAjsFpjFr1FysF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrF/4EhpF9BELBFPqFz2FTUFt6FOZFjmF6LFynFrSFxDEwuEpSFTMFntFqjFZIFrIFjhFz5BwsESBF1iEvvFv0BtUFGIFEZFNPFZyBCaFC0FvEFvSF1wFR6FYGFl6FBRFmwFlZFPHFxnFyxECWF3sEZwF0HFrvFSyF4KFzuEiGFSJFjjFjSFGwBQaF5SFpuFEJFMJFzFFENF4nFCyBy3AnRFaUF0xAKoFGwBSIFRwBIiF1uF54B0DF1IFskFHyBntFERFtUFyhF1IFVwBw5BYSFxwF5vEvZF2rECNFGXFpyBw5E31B5PECuFMjF1IEyHEf5BrLFk6FkMFfaFh4BOyBy1BnYF1PFmSF6wFVrF3sFl6F1nEl3Fr3B3EFRVFPCFRIFhSFStFhtFzJEzOE5IFu5FkYF0aFXIFExF1yAtHF0oF6yBVDF1mBzhFp9BBNFmsFtZES5BYjFx5BQBFhhFxwFIJFw5EiaFSyFyhFtlEwtEMDFK3BoiFnUFmDFyVEmGFo2BpfFWpF4EEHCFMwBnmFyqFKvF44ADMFr5F3pEyoFL5FlIF0kFpKFzOF6ZFSyFU3F3PEPpFMYFnmFWHFK6FioFGHFQKFN3FmzEpnF9DEnwBByFLKFT6FKNF3JEuXFz5FjWFXFFBFFm1EysFmpF49BxmAhkF1yFs9Bb1FysFfwFshFpuFdBFJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFcIWxUA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
truncated
/ Frame 2112
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
aaa768b1139e338caa8e89d449dcf7bbfa7fb2d3d6b78718b549549dcee81c8d

Request headers

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

Response headers

Content-Type
image/png
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabF8QAAUkzFUCPAAAXUAAAAB/FkAZAAAOA55A55A85B55A58E55A55AFA1zA0yA1BEr/FkAPAAAvX9AAAjrp0APAAAAAAAAATrp0APAAAvX9AAAj/FkAPAAAAAAAAAT/FkAPAAA/IAAAABvX9APBAAFAAxCNTvX9ASksF+PdXUAAAAgCAYJAFAAA/FkAAANJo0F0wFz6BvvAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF90Az5A5yAz2AmrEpkF9zAz4A22Ay3Am3Ew0F9IEm0Ez9B40A05AxyA25A3mAjsFpjFr1FysF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrF/4EhpF9BELBFPqFz2FTUFt6FOZFjmF6LFynFrSFxDEwuEpSFTMFntFqjFZIFrIFjhFz5BwsESBF1iEvvFv0BtUFGIFEZFNPFZyBCaFC0FvEFvSF1wFR6FYGFl6FBRFmwFlZFPHFxnFyxECWF3sEZwF0HFrvFSyF4KFzuEiGFSJFjjFjSFGwBQaF5SFpuFEJFMJFzFFENF4nFCyBy3AnRFaUF0xAKoFGwBSIFRwBIiF1uF54B0DF1IFskFHyBntFERFtUFyhF1IFVwBw5BYSFxwF5vEvZF2rECNFGXFpyBw5E31B5PECuFMjF1IEyHEf5BrLFk6FkMFfaFh4BOyBy1BnYF1PFmSF6wFVrF3sFl6F1nEl3Fr3B3EFRVFPCFRIFhSFStFhtFzJEzOE5IFu5FkYF0aFXIFExF1yAtHF0oF6yBVDF1mBzhFp9BBNFmsFtZES5BYjFx5BQBFhhFxwFIJFw5EiaFSyFyhFtlEwtEMDFK3BoiFnUFmDFyVEmGFo2BpfFWpF4EEHCFMwBnmFyqFKvF44ADMFr5F3pEyoFL5FlIF0kFpKFzOF6ZFSyFU3F3PEPpFMYFnmFWHFK6FioFGHFQKFN3FmzEpnF9DEnwBByFLKFT6FKNF3JEuXFz5FjWFXFFBFFm1EysFmpF49BxmAhkF1yFs9Bb1FysFfwFshFpuFdBFJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd/IAAAA4NAYJAFAAAvX9AOAyxA12A15AfxB03A4zA5fEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFq4rpVA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 1FE3
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 1FE3
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
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
2a00:1450:4001:818::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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame BE59
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Sun, 15 Dec 2019 16:17:16 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame BE59
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
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
2a00:1450:4001:818::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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.249.185.179 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-249-185-179.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sat, 14 Dec 2019 08:05:41 GMT
Content-Encoding
gzip
Last-Modified
Fri, 13 Dec 2019 10:00:01 GMT
Server
akka-http/10.1.11
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame 5467
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWD_kWDwsWDRkEiUkWsfABifABSfABSfABi7ABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4212424181921045915
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4212424181921045915
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 15 Dec 2019 16:17:16 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:16 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4212424181921045915
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
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
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?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b7f09fcd3b0e1ea0802316344863eb8bfe55c8401f29fbb9a2d0fe2e4595a2d6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
gzip
last-modified
Tue, 05 Nov 2019 14:27:52 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5dc186e8-a744"
content-type
text/javascript
status
200
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Mon, 16 Dec 2019 16:17:16 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 1FE3
303 B
207 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3018223278406275&correlator=1129853631387724&output=ldjh&impl=fif&eid=21062453&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191215&iu=%2F53015287%2Fgolem.de_d_970x250_4_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32&scp=adslot%3Dbillboard2%26src%3Dsdg%26yieldlove_pid%3D18494%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522billboard2%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522f10x1%2522%255D%252C%2522as%2522%253A%255B%2522billboard2%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522billboard2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b307b3d14cffddca649d7d38f3cc5922%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%252C%2522100-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-0%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-4%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n51-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n22-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-0%2522%252C%2522n92-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-4%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-2%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-0%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n81-1%2522%252C%2522n88-0%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A18494.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252218494%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3Debcb29bd7afdff72%3AT%3D1576426635%3AS%3DALNI_MY8JhdQN2o53q7kse13uxhwWWeZ8g&cdm=www.golem.de&bc=31&abxe=1&lmt=1576426636&dt=1576426636827&dlt=1576426636688&idt=132&ea=0&frm=23&biw=1585&bih=1200&isw=970&ish=251&oid=3&adx=308&ady=1408&adk=2408324468&uci=2mfhngyxgome&ifi=1&ifk=1555408520&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.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&ga_vid=603523472.1576426636&ga_sid=1576426637&ga_hid=2098456921&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
dced860be7f052f278301870db6eb0eaf9618b94d4de672389536c6c956b782b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
130
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 1FE3
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

truncated
/ Frame 1FE3
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6c8b48c64910012d209e8d53d4fed357da21f101ba45ddb7c40c9d91e7b635a4

Request headers

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

Response headers

Content-Type
image/png
ads
securepubads.g.doubleclick.net/gampad/ Frame BE59
307 B
213 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2956986260228012&correlator=1756562945358822&output=ldjh&impl=fif&eid=21062415%2C21062819&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191215&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C301x250%7C300x126%7C34x32&scp=adslot%3Drectangle2%26src%3Dsdg%26yieldlove_pid%3D17300%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle2%2522%255D%252C%2522af%2522%253A%255B%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle2%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b307b3d14cffddca649d7d38f3cc5922%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%252C%2522100-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-0%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-4%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n51-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n22-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-0%2522%252C%2522n92-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-4%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-2%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-0%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n81-1%2522%252C%2522n88-0%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A17300.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217300%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3Debcb29bd7afdff72%3AT%3D1576426635%3AS%3DALNI_MY8JhdQN2o53q7kse13uxhwWWeZ8g&cdm=www.golem.de&bc=31&abxe=1&lmt=1576426636&dt=1576426636855&dlt=1576426636693&idt=157&ea=0&frm=23&biw=1585&bih=1200&isw=301&ish=250&oid=3&adx=993&ady=4258&adk=4008869679&uci=xv3booyq401t&ifi=1&ifk=4200391111&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.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&ga_vid=603523472.1576426636&ga_sid=1576426637&ga_hid=2007951253&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
2ef7d2a12520cb2b283f80482b4b619b6fdc122ed8c60898f9a5203c0e19543a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
134
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame BE59
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

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

Response headers

Content-Type
image/png
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabGtSAA/k0F0ImvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A2zA25Aw2A34AxmAjwFpkF9kElzFr0FvwFmhEwhF91AyxA54Ax3A3yA3mAjpFk9BxzA4yA50AwwA4wAxyAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA54Ax3A3yA3mAhwFk9B1yAx5A4xA33Ay3AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A0yA22Az2A30A4mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzwAw4ExyA1mAhkF29Bx0A15A12A33A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A02A3zAx2A1mAjpFk9BxzA4yA5wA0xAz5Az4AmzEp6Fl9BzwAw4ExyA1mAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFmhEwjF91Ax5A02A3zAx2A1mAhwFk9B1xA50A23AzxA21AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA23A2zALlnFCUkzFYBPLAAAAAAAABg0tAPAAAFAAg0tTbosAPAAAXPA8MABbosAZAAAOA55A55A85B55A58E55A55AGAx4A32A4wArbosASksF8FjAAAAAAAAAAAAEAAAg0tAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4ExyA1BEMAxzA4yA5wA0xAz5Az4AGAkpFylFj0FAAAAJAx0A15A12A33A1BEKA1xA50A23AzxA21AJAylFj0FhuFnsFlBFKA1xA50A23AzxA21AKA1xA50A23AzxA21A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdXPA8MAsEA9BAFAAAbosAAAAARA4tB1uFruFv3FutBzwAw4ExyA1BEAAAAAAAAAAAAAAAAQtjFrNCoWA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabHuSAA/k0FWNmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A2zA25Aw2A34AxmAjwFpkF9kElzFr0FvwFmhEwhF91AyxA54Ax3A3yA3mAjpFk9BxzA4yA50AwwA4wAxyAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA54Ax3A3yA3mAhwFk9B1yAx5A4xA33Ay3AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A0yA22Az2A30A4mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzwAw4ExyA1mAhkF29Bx0A15A12A33A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A02A3zAx2A1mAjpFk9BxzA4yA5wA0xAz5Az4AmzEp6Fl9BzwAw4ExyA1mAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFmhEwjF91Ax5A02A3zAx2A1mAhwFk9B1xA50A23AzxA21AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA23A2zAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA24A31ALlnFDTkzFPPwBAAAAAAABJXGASksFCFjAAAAAAAAAAAAEAAAJXGAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBQtjFcVq/YA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
activation
adstax-match.adrtx.net/ Frame D133
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Sun, 15 Dec 2019 16:17:17 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabIoTAAUkzFFCPBAAFAAJXGTTfPAPAAAqEA2VABTfPAZAAAOA55A55A85B55A58E55A55AFAy2Aw1A3BErTfPAPkAAqEA2VAHTfPAPBAAXUAAAAH/FkAPBAAXPA8MAHbosAPBAA/IAAAAHrp0ARksF6dqEA2VAKPA7DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFKefTSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabJpTAA/k0F+RmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A2zA25Aw2A34AxmAjwFpkF9kElzFr0FvwFmhEwhF91AyxA54Ax3A3yA3mAjpFk9BxzA4yA50AwwA4wAxyAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA54Ax3A3yA3mAhwFk9B1yAx5A4xA33Ay3AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A0yA22Az2A30A4mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzwAw4ExyA1mAhkF29Bx0A15A12A33A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A02A3zAx2A1mAjpFk9BxzA4yA5wA0xAz5Az4AmzEp6Fl9BzwAw4ExyA1mAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFmhEwjF91Ax5A02A3zAx2A1mAhwFk9B1xA50A23AzxA21AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA23A2zAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA24A31AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13A20Ay2A2zA25AzzATkzFARksFAQtjF4mg/ZA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:15 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.43.86 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-43-86.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 15 Dec 2019 16:17:16 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
truncated
/
195 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a

Request headers

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

Response headers

Content-Type
text/javascript
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
701 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=8950975718
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.217.36.102 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:18 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
9ACC94DD36597658
Content-Length
53
x-amz-id-2
9lJXEY8mVVRMljMz8ppcK85d9zQ/7qQoJKI1g4kEYxlVm08I5tJ3ccAAklsqbuicRGCgTv+Fk8k=
Last-Modified
Sat, 14 Dec 2019 17:45:23 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php?cache=6924630136
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Last-Modified
Thu, 14 Nov 2019 17:36:22 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
993 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=1433392318
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Via
1.1 61adf71a363fe0f836dc69dbb43de824.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA53-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
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
eA4UBRNbUYt80uhHfktAa0_qevVmkIdRdLo7T7K3sHF3PADcPI4bag==
Expires
0
/
ssl.1.damoh.golem.de/17482084a6bbbe93cc3993c94e23ccacfc72c27f/
311 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/17482084a6bbbe93cc3993c94e23ccacfc72c27f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.104.22 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.22.104.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

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

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:57 GMT
Server
AmazonS3
Etag
"d6efb72fc51c297f7098e2b1c92794c5"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.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
de4-homad-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
usersync
uss.xplosion.de/
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=b307b3d14cffddca649d7d38f3cc5922
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 15 Dec 2019 16:17:17 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
hic_qos
ssl.1.damoh.golem.de/
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.104.22 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.22.104.243.136.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 15 Dec 2019 16:17:17 GMT
Last-Modified
Wed, 08 May 2019 11:38:02 GMT
Server
openresty/1.15.8.2
ETag
"5cd2bf9a-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 942A
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
24c6679f0af6186c4ed4bf43a16f8ef1ba54c32ff1c5317e6103538f3bfc0ef8

Request headers

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

Response headers

Content-Type
text/javascript
/
ssl.1.damoh.golem.de/940ed015209ae093422194d812b0af52c17d3d4f/
110 B
670 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/940ed015209ae093422194d812b0af52c17d3d4f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.104.22 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.22.104.243.136.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

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

Response headers

Date
Sun, 15 Dec 2019 16:17:17 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://www.golem.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
110
activeview
pagead2.googlesyndication.com/pcs/ Frame 2112
42 B
578 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssmAYVqjz4L7A1mN-YB9ApA8wDvZfPgMlRhLWCWH4yE8BCYmiGLqG1cEpX7ik-BHiQIRmoFIQ64_KuLTEi28dkwIJdE1S0Hq7uv9KnPZEk&sig=Cg0ArKJSzOhQRbSxlxnlEAE&adk=2740773112&tt=-1&bs=1585%2C1200&mtos=1050,1050,1050,1050,1050&tos=1050,0,0,0,0&p=838,993,963,1293&mcvt=1050&rs=0&ht=0&tfs=108&tls=1158&mc=1&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1576426636686&dlt&rpt=79&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C12447&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-4-12-3-11-11-0-0-0&tvt=1156&is=300%2C125&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&wf=0&cac=1&cd=0x0&itpl=19&v=20191206
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

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 15 Dec 2019 16:17:17 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 26EE
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?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.249.92 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-92.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/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

Last-Modified
Tue, 12 Nov 2019 06:59:02 GMT
ETag
"13006b6-97cd-59720c88c16d1"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
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
14515
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=86654
Expires
Mon, 16 Dec 2019 16:21:33 GMT
Date
Sun, 15 Dec 2019 16:17:19 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame A8F9
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?golem.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/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 15 Dec 2019 16:17:19 GMT
Age
11342123
Connection
keep-alive
X-Served-By
cache-jfk8124-JFK, cache-fra19144-FRA
X-Cache
HIT, HIT
X-Cache-Hits
1, 1226581
X-Timer
S1576426640.817260,VS0,VE0
Vary
Accept-Encoding
index.html
cdn.districtm.io/ids/ Frame EE83
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

:method
GET
:authority
cdn.districtm.io
:scheme
https
:path
/ids/index.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
date
Sun, 15 Dec 2019 16:17:19 GMT
content-type
text/html
set-cookie
__cfduid=dcee360235dd709b206bc2bb073929e941576426639; expires=Tue, 14-Jan-20 16:17:19 GMT; path=/; domain=.districtm.io; HttpOnly
cf-ray
5459ba22cd7ed6dd-FRA
cache-control
s-maxage=1209600, max-age=14400
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
server
cloudflare
content-encoding
br
pd
eu-u.openx.net/w/1.0/ Frame 9DF2
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.171.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=e5456c56-68d7-09bb-2b01-bd4955632f6e|1576426639
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept, Accept-Encoding
set-cookie
i=e5456c56-68d7-09bb-2b01-bd4955632f6e|1576426639; Version=1; Expires=Mon, 14-Dec-2020 16:17:19 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1576426639|mOgikimWiygu; Version=1; Expires=Mon, 30-Dec-2019 16:17:19 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.171.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Sun, 15 Dec 2019 16:17:19 GMT
content-type
text/html
content-length
374
content-encoding
gzip
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=e5456c56-68d7-09bb-2b01-bd4955632f6e|1576426639; Version=1; Expires=Mon, 14-Dec-2020 16:17:19 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.171.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Sun, 15 Dec 2019 16:17:19 GMT
content-length
0
via
1.1 google
alt-svc
clear
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 1419
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?golem.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/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
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/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 15 Dec 2019 16:17:19 GMT
Age
11342124
Connection
keep-alive
X-Served-By
cache-jfk8124-JFK, cache-fra19129-FRA
X-Cache
HIT, HIT
X-Cache-Hits
1, 3504841
X-Timer
S1576426640.823225,VS0,VE0
Vary
Accept-Encoding
data
lb69.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb69.s400.meetrics.net/data?/bXabKNOBALlnFEUkzFjCPVAAAAAAAABtjXAPBAAFAAtjXTCDTAPAAAXPAWCBBCDTAZBAAOA55A55A85B55A58E55A55AFA52A05AzBErCDTAPFAAXPAWCBHCDTAPREAAAAAAAKTfPAPBAAAAAAAAKCDTAPaJAAAAAAAITfPAPAAAAAAAAAICDTASksFFGjAAAAAAAAAAAAEAAAtjXAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdXPAWCBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFN1BATA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:20 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 15-Dec-19 16:17:19 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1576426646057
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.149 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 15 Dec 2019 16:17:26 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Failed requests

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

Domain
video.golem.de
URL
https://video.golem.de/teaser/1/1/23863/thumb-high-1000/robomaster-snap.jpg

Verdicts & Comments Add Verdict or Comment

175 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| Golem object| _gcpx string| _rngnafc boolean| _rngnaf string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk function| checkOmid3pExist object| de_meetrics undefined| list boolean| apstagLOADED object| apstag object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq number| google_srt boolean| google_measure_js_timing boolean| google_noFetch number| __google_ad_urls_id function| $ function| jQuery function| golemAcceptCookies object| Criteo object| stroeerCore number| google_unique_id object| gaGlobal object| confiant object| google_ad_modifications object| google_logging_queue object| google_reactive_ads_global_state boolean| _gfp_a_ object| adsbygoogle object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc object| google_sv_map object| google_t12n_vars boolean| deliveringAds boolean| subDomainCheckVar function| ZJRYCdd object| rzwlg30dFlags string| rzwlg4fbRnd object| rzwlgdb6ftc string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag number| _m6rApiLoaded boolean| rzwlg498sdl boolean| rzwlg498sdln string| rzwlgdb6fgenat string| rzwlgdb6fsthash boolean| rzwlg9aaforceimp 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 object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired boolean| rzwlg863Body boolean| rzwlg5c9Detect object| rzwlg454Mobile object| rzwlgdb6f1 object| rzwlgdb6fo1 object| rzwlgdb6fo2 object| rzwlgdb6fo3 object| rzwlgdb6f2 number| rzwlgdb6fd3 number| uabInject object| rzwlgdb6f4 object| rzwlgdb6f5 boolean| rzwlg6d5ij function| Swiper object| __io object| google_tag_manager function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| rmp3pi function| SwfVideo object| exportz object| m string| GoogleAnalyticsObject function| ga function| confiantTryToGetConfig object| _m6rOnce number| _m6rContainerLoaded function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| google_tag_data object| gaplugins object| gaData object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock string| _io_uniques_holing_params object| _google_rum_ns_ function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google object| closure_lm_47930 object| closure_lm_274485 function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript string| apsrc boolean| rzwlgf25Track object| audienceProjectLayer object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| criteo_pubtag object| DahBeiDiocaePoos function| videopkgInterface string| hic_qos

19 Cookies

Domain/Path Name / Value
.agkn.com/ Name: ab
Value: 0001%3AasFkQV2ZXwysHs44yLH4WMEkDUqD34xwHcXJu2ftvkcbzWJ8aBReoA%3D%3D
.agkn.com/ Name: u
Value: C|0AEAliRkMJYkZDAAAAAAAAg1RAQCADVIBAIA
.golem.de/ Name: _gat_gtag_UA_518800_2
Value: 1
.golem.de/ Name: __io_visit_43098
Value: 1
.golem.de/ Name: golem_uv
Value: 37b37051
.golem.de/ Name: golem_us
Value: 37b37051
.golem.de/ Name: _ga
Value: GA1.2.603523472.1576426636
.golem.de/ Name: __io_unique_43098
Value: 15
.golem.de/ Name: __gads
Value: ID=7aa446dd2cc47b55:T=1576426635:S=ALNI_MasATugOs-DY4ZJIy-a__Jh6n98nw
.golem.de/ Name: ioam2018
Value: 000fbda6dce7542605df65c8b:1604247435906:1576426635906:.golem.de:2:golem:GHOME:noevent:1576426635906:b3sr04
.golem.de/ Name: golem_viewauto
Value: desktop%3Agoogle_chrome_74
.doubleclick.net/ Name: IDE
Value: AHWqTUlPeSRWZQhYe9lEouNI4oa3ykXxpcRyQUY3cK3M5wBHqC8dBN1OMn_uViN4
.golem.de/ Name: _gid
Value: GA1.2.144682408.1576426636
.golem.de/ Name: __io
Value: e93746574.794e9dda5_1576426636038
.golem.de/ Name: golem_uz
Value: 37b37051
.doubleclick.net/ Name: DSID
Value: NO_DATA
www.golem.de/ Name: session_id
Value: b0d7c20f-df6a-4cd6-88cd-ebec29ca3f3f
.golem.de/ Name: __io_uh
Value: 1
www.golem.de/ Name: __io_lv
Value: 1576426636038

2 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js(Line 365)
Message:
IMA outer:newman

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

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.

account.golem.de
acdn.adnxs.com
ad.yieldlab.net
adfarm1.adition.com
ads.golem.de
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
api.theadex.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bidder.criteo.com
c.amazon-adsystem.com
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
cpx.golem.de
cpxl.golem.de
d.agkn.com
de-gmtdmp.mookie1.com
de.ioam.de
dmp.theadex.com
dmx.districtm.io
eu-u.openx.net
golem.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb69.s400.meetrics.net
nugmw.userreport.com
orbidder.otto.de
pagead2.googlesyndication.com
prg.smartadserver.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
s0.2mdn.net
s3.amazonaws.com
s385.mxcdn.net
s400.mxcdn.net
sak.userreport.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
static.criteo.net
stats.g.doubleclick.net
tpc.googlesyndication.com
tracking.m6r.eu
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagmanager.com
www.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
video.golem.de
104.108.37.125
104.16.190.66
116.203.212.0
13.35.253.119
136.243.104.22
136.243.4.7
143.204.214.52
143.204.214.83
151.101.113.194
151.101.13.108
172.217.23.98
178.250.0.130
178.250.0.165
185.33.223.202
185.64.189.112
185.86.138.32
194.213.222.30
2.19.33.59
216.58.207.34
217.79.188.8
23.210.248.245
23.210.249.164
23.210.249.210
23.210.249.92
2600:9000:2057:4800:19:fc2c:a140:93a1
2600:9000:2057:5c00:1c:8c89:a300:93a1
2600:9000:2057:ee00:15:efbc:e300:93a1
2600:9000:214f:6000:1f:a1b:34c0:93a1
2600:9000:214f:7a00:12:6213:9cc0:93a1
2606:4700:20::681a:3cd
2a00:13c8:f5::f:4b3d:148
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:180
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:800::2006
2a00:1450:4001:80b::2008
2a00:1450:4001:814::2002
2a00:1450:4001:815::2001
2a00:1450:4001:815::200e
2a00:1450:4001:818::2002
2a00:1450:4001:819::200a
2a00:1450:400c:c00::9a
2a02:26f0:64:493::5f76
3.122.43.86
34.248.95.73
34.249.185.179
34.95.120.147
35.186.238.175
35.206.134.202
37.157.4.24
52.208.73.164
52.217.36.102
52.222.153.2
89.163.159.110
89.163.159.116
89.163.159.121
91.215.100.40
91.215.103.64
95.216.24.149
01bcbcdf86b3d25bb9b196527572bbf7fd3b22a554eca2bdf6a2d4a7a46f38da
02867c96fed3edca2ab6693646ff6cb5be5a17603e5cd4e51d6243df31db3c75
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
05e5e421628198d0416646ef6faadd33f8c5f66dc4a7c1629a0cf7c284b3a227
068309afad0bc76aec38630128c3d19822b5ade7bd397b437a3de0ad9c298e3c
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1
0c39c021ffc08f13cc0f38f80996cc76081317c2ef84c217904b9d7fa7244feb
0d33ad69a547935e1e7f0c192b196a82ecd23cde79a176b769b79d8473504a4c
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9
0faee9d650c237f7f4e5715e92b3a0d362b32fe92bd21d4ff5229533a03b6eb1
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
1509362b6c5361c8b29dfefd5e9c484fe64073c9139226c40f08ee517c0f1de1
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
16ed47f1cd79f4b87625326a7befd9b70374e4ac4d1b3ca9a5018db0741320aa
1b48cdd3a4523fc686017e8e5e15b194f88a51c685582696abf90f5ee10bd4ee
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
20cdda5f0e51f5dac5693ffe15fb394528dd838e9887a785de1d02e3bb2a418f
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
24760e5c78c3d648ed26a81c9825849d0659f00395de03da589b4cf8d1c32a16
24c6679f0af6186c4ed4bf43a16f8ef1ba54c32ff1c5317e6103538f3bfc0ef8
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8
29fb337f70b281dafbd92bcf1dc5a61c98279fb589df86249ebe07dcb9342d90
2a6af145b40cb0465f1b8be0af43049fce3942493450dca255cddaf80eab6ed6
2c616818963f78e94e98b0c8b9f8f6b0e2f69a4ed04046648c1a0c25aca5a15c
2d04a4f51c4bf994aeb8d7f06f0a744b3127996f8149aabb034e960712cefb54
2ef7d2a12520cb2b283f80482b4b619b6fdc122ed8c60898f9a5203c0e19543a
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
341ae8b7babc44d0c3bcf125b6fe8ea3a0a58f3e124b517a311ea01b5dc4da23
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
35209a9378fa2d9545a74c40e8d8813c16d0fe90d974395c17d975f89f83bc0b
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
38ed0453588e6faede50753a35ff2d7305a71b3e5ef473a0201ec155191acc97
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
417f460fcc19ed1da2620db6953d7e7d84a5f483a1db5629ee9b523698a99bad
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
5162ff00b4d08ed6f2cd8491940c2cf233531d81a9e0be3cb91fa51b07d90c9f
51ebfcf39139ee35d534772985bbd3a55c69ad495d55f766c64c32d7ae922221
52853f171b1c2bdd6fc7fd093442f6b9b07b2d1a975671a4c81f17b06b35dcd2
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
580f84eaf8bac2198853f91f9a8558b193188ce15d89ea1da26ee451d188744f
589250dba43180fe0cf7501aba948265021df9e22aa1fb7c8730cbb9103311d2
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ce279e333e2753579e8ffe45a41228f2222a54b123997c42b661fe8cb80b907
60c81aea75fd199e87f233a36df752810228f969d02eb34aa7fa1ed06c30371c
610f7772eaba86e5daa5311a03ad90fce900deb1cf93453334100640d90bd5e2
61a1467b8f50a64d99427cd8819f6a72791767799707d7da7f5b10ff55f0e51e
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63890326f558587b0840eb0a6e6377f1bf39264e015e568f4c2a03aefce3f929
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
64484f3feac9b54f1e55dd2f98213eeeba00cb8372b5172615239f554577d3b2
64f594daaa982f06872c43c318e2e7a764acaabb1fa7e7b166f5aecfb2e39279
66139eb6b84d9595b190aef89ed6775c83d0335bba775ce91459f2975b3bba6b
66897ca9d1cc150fb7ea4f792ab1ad7f3eb3ddf38855cee5e05d4c0cd04240ae
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
68bcdec2fdc6ce23468b97a8c39a3f9eb86233e03be5072bf3b438ac1433714d
68e5d05a49f87de307f65935943c6496630fb3451a54b9f96b7773fb8555480a
6bb4ed6f0ab117491217d63a3e7292fe41d9950d0eb015c0c39a56cf0cf07d10
6bff714e860bae55ddf8c9f6a4c8bea6ce2ef3baed5c92894d620e80524c9b04
6c7941ec9ceb8f3b1b5f35f1eb05e1b44c0db416386acdba81278a6f69cbd9e7
6c8b48c64910012d209e8d53d4fed357da21f101ba45ddb7c40c9d91e7b635a4
6fba68ac9345123605b8512151a8120eb95780ca36f1edb74c910d3683066794
70fcc9475d77c50d773547b426bbffd94094b86aba92e0e8da917fb01395a6c8
70fcf08edf288ef450875f11d5cbd711804a9e2c20cd1d3190bfa38840e993be
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7207dcdc68b43142844cfef7d74159fa32f94650d5f116272fb3fe19f56b5ff7
745a085b52b8371ec6705413fca70a28c6d8bff0db480e6b124bd08c54e95ef8
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7654775a53d60ca555f70b048aeda0be21eff9d2cb8d6893a56cdb876a5fe26d
79a2e9bee80a87d2cce804c3e35f2badacdd081b3ed81a1d1e353981f6f2010a
7d5baa33638e65cc2670d043eed681e1177668157627cce4087ced9911919009
7e77822c147ce432c499957247ba93ded69a76db2da5a1f9e69e80ccc0cabef5
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
823e42aa2d4afb9433ad1a11cc65d4f756e259634370a943537d4a1ba63d6f6f
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
8535832aa4696ad21b220e2c3a07d6ea9c684c6b6010bbf3d2def08dd0bdff74
88e489a2781814dbbd65e02b744b8c42ff0e87db3c9abf8f83a39596efe1c9ea
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8ad8558f5a3ddc33e15d7664301ad96c4affb90c9d34a0051e811a6cdb1131b3
8adf603a90ba742c3a11cf06980a2f2b0be4e6e0a728387d564de4474ce6f4b5
8ec03c1085ee3786d826726ead14faa5ee36b122d78306f4de0f54e23256d766
918c4485a28931feb333074355c2f4c2e915ffa51fe70b8797e9432c37b22b8f
921d2930dec16635e5b3efee4f21844bc10b8f42f81abb0b89589e9ab8b73b33
9349c4888e6869354d44dad059fce0b84b8286d918fad03cb65a8438f22a47c6
934dbcf518caacaaf31c3149b93828d85661d2b706cd85a8763c0a4637c5468e
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9e45b6381a26ea57fc04c2839a97286570c05a63f0aeee42f2091bc8e61f18d2
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a3ddf4d7132ad7c72948e5b3e40f7987c392b45484dd251877ec1bb9b817dbbb
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
a968852406a7f5c2a6be7edc5a5831d1fe64ebcaf75e4d201f7f94948af4ef31
aaa768b1139e338caa8e89d449dcf7bbfa7fb2d3d6b78718b549549dcee81c8d
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187
ac7fae2fe6377c7cddce54bd395f0b9987c87e384063bf634cff71ba3836e43a
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b1c45061e8e418105a0602f7400fc1253b9855f7c0e1cac9350631066b3674f4
b1f87d39e9bd6300b2589f2944896dac8e8d11837f125769bd8a986ec60e554d
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b7f09fcd3b0e1ea0802316344863eb8bfe55c8401f29fbb9a2d0fe2e4595a2d6
b910127374d0859902ba945dc7add297b4d1fde4b2fc89488fa1df79612cb501
bba2172b72e9ccdf95e8960fec90943767eea660946a8f534a8bd61776bcfa6e
bf6f4af4d79873f3116f2c0a5748d3087ac4a597af9252c6d85812b1de9c8d08
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c447e7c23baa0c7424dd430964035ddd3be41dd3ca4ecf29b7b577cc2c25e9a3
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d40c754096ea82a106dcd26815742b8af6e8cc2999bbe6ca3eecc4a1ebcdd28b
d4d2956a2b4f4e52d5d5a78b038aa3586bca0788f89924e2a0c3ffd61e3a2765
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
da80fcfbcf129186f8d0d5c642408ec15e31641e6e4d95e1adfa9062cb40a07e
db09f8d342d5de0e6b5db56920ac175e983492a8c109bb807dbfb1142bbf1346
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
dced860be7f052f278301870db6eb0eaf9618b94d4de672389536c6c956b782b
df8bb9194111b87c1ee8e768cb13c03b9da9fa91977481715a7b865c8f10a3e6
e0b7e91ff505bfbbaba551bdd84169bcee03bad0f7ce6d4ff4352fccf648cc24
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e2283cc6375315dd87743feff83d9f48424933159f87e35215eb859acc3c11a6
e28262de85aa9b9ce32f355fc9caa973d53e18ada15113c77b910d4a0eeaf144
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e709762e44e6d15baf9572e12b302e3d91d9a55a51cab10f1bf18e9ede2a9abe
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ecd5e1c29e1a88b4e4698dffd9d932f9bd326df0f108d0eb749d51ac4742d750
ed035713f167c05eff55881c34d3b7c01ec9888c532c21e78611996e3c60320f
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f10e77f7cd0e88fdde30ebe9e5daeb88871e150210ca8132bdfcbc7326b7f3e6
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f62a0b06cac8f6d9fc14e97bd292a2863e45f79b505bb3c67cbd2ea042f27564
f9bf008e0c39cf80db2028fccb95b9fd00f0c8472d67078c26187f883e0f654d
fb764e83b3323ec38ff3a7298014f51287580d7c2d656f4e4ee195e1dc8cfc70
fd58df121a11e5f7c81e59ade394810b68d40034d3d11e2d9a73d2f049ed275a
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ff9123fd26cd1c19cd81666296b20cc4e41b3ad5eb7319c8fe935fabcfd5c3c3