Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On September 26 via manual from DE

Summary

This website contacted 59 IPs in 9 countries across 43 domains to perform 257 HTTP transactions. The main IP is 77.247.84.129, 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
1 78 77.247.84.129 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
30 172.217.16.194 15169 (GOOGLE)
1 143.204.214.67 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
3 9 104.109.82.87 20940 (AKAMAI-ASN1)
1 80.82.201.88 48173 (UNBELIEVA...)
10 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 142.93.164.12 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
3 148.251.131.173 24940 (HETZNER-AS)
1 2600:9000:20b... 16509 (AMAZON-02)
1 77.247.84.149 25291 (SYSELEVEN...)
2 34.95.120.147 15169 (GOOGLE)
2 3 37.157.4.40 198622 (ADFORM)
2 104.16.190.66 13335 (CLOUDFLAR...)
4 69.173.144.141 26667 (RUBICONPR...)
4 185.86.138.79 201081 (SMARTADSE...)
2 185.33.223.83 29990 (ASN-APPNEXUS)
1 2.18.234.21 16625 (AKAMAI-AS)
5 2a00:1450:400... 15169 (GOOGLE)
1 3 2a00:1450:400... 15169 (GOOGLE)
10 176.9.42.70 24940 (HETZNER-AS)
4 6 2.18.234.72 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
9 2a00:1450:400... 15169 (GOOGLE)
9 2a00:1450:400... 15169 (GOOGLE)
2 89.163.159.106 24961 (MYLOC-AS)
3 148.251.69.233 24940 (HETZNER-AS)
2 2 63.32.23.112 16509 (AMAZON-02)
1 1 136.243.12.39 24940 (HETZNER-AS)
2 52.216.239.181 16509 (AMAZON-02)
2 151.101.13.194 54113 (FASTLY)
1 3.121.36.175 16509 (AMAZON-02)
3 143.204.214.52 16509 (AMAZON-02)
6 188.40.118.169 24940 (HETZNER-AS)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 1 216.58.207.34 15169 (GOOGLE)
1 2.16.122.151 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
5 2a00:1450:400... 15169 (GOOGLE)
4 46.4.49.53 24940 (HETZNER-AS)
3 52.28.163.57 16509 (AMAZON-02)
1 136.243.90.4 24940 (HETZNER-AS)
1 23.37.55.184 16625 (AKAMAI-AS)
1 151.101.13.108 54113 (FASTLY)
1 62.168.44.118 5588 (GTSCE GTS...)
4 52.18.18.165 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 143.204.214.51 16509 (AMAZON-02)
1 2600:9000:20b... 16509 (AMAZON-02)
1 85.114.144.106 24961 (MYLOC-AS)
1 2600:9000:20b... 16509 (AMAZON-02)
1 54.154.35.6 16509 (AMAZON-02)
1 1 89.163.159.110 24961 (MYLOC-AS)
1 34.248.95.73 16509 (AMAZON-02)
257 59
Apex Domain
Subdomains
Transfer
100 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.3.damoh.golem.de
ssl.1.damoh.golem.de
2 MB
37 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
607 KB
17 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
203 KB
10 meetrics.net
lb80.s400.meetrics.net
3 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
7 KB
9 googletagservices.com
www.googletagservices.com
260 KB
7 selfcampaign.com
lib.selfcampaign.com
delivery.selfcampaign.com
track2.selfcampaign.com
track.selfcampaign.com
6 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
5 google.co.uk
adservice.google.co.uk
1 KB
5 adscale.de
ih.adscale.de
js.adscale.de
8 KB
5 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
7 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
27 KB
4 smartadserver.com
prg.smartadserver.com
1 KB
3 yieldlove-ad-serving.net
tracking.yieldlove-ad-serving.net
321 B
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 google-analytics.com
www.google-analytics.com
18 KB
3 adnxs.com
ib.adnxs.com
acdn.adnxs.com
2 KB
3 adform.net
adx.adform.net
c1.adform.net
867 B
3 ioam.de
script.ioam.de
de.ioam.de
13 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 googleapis.com
imasdk.googleapis.com
90 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
20 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 adsrvr.org
match.adsrvr.org
902 B
2 districtm.io
dmx.districtm.io
cdn.districtm.io
397 B
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
11 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 nuggad.net
si.nuggad.net
ap-sync.nuggad.net
2 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 userreport.com
sak.userreport.com
18 KB
1 mookie1.com
de-gmtdmp.mookie1.com
495 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
10 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 casalemedia.com
as-sec.casalemedia.com
902 B
1 google.com
adservice.google.com
171 B
1 google.de
adservice.google.de
171 B
1 googletagmanager.com
www.googletagmanager.com
27 KB
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
84 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
61 KB
257 43
Domain Requested by
77 www.golem.de www.golem.de
30 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb80.s400.meetrics.net www.golem.de
9 tpc.googlesyndication.com securepubads.g.doubleclick.net
9 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
9 tracking.m6r.eu 3 redirects www.golem.de
tracking.m6r.eu
8 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
7 video.golem.de www.golem.de
text
7 cpxl.golem.de www.golem.de
6 tt.onthe.io cdn.onthe.io
5 adservice.google.co.uk securepubads.g.doubleclick.net
5 googleads.g.doubleclick.net pagead2.googlesyndication.com
4 ssl.3.damoh.golem.de text
4 ih.adscale.de 3 redirects js.adscale.de
4 prg.smartadserver.com cdn-a.yieldlove.com
4 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 tracking.yieldlove-ad-serving.net cdn-a.yieldlove.com
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 track2.selfcampaign.com www.golem.de
3 www.google-analytics.com 1 redirects www.googletagmanager.com
www.golem.de
2 uss.xplosion.de www.golem.de
2 ups.xplosion.de confiant-integrations.global.ssl.fastly.net
cdn.emetriq.de
2 imasdk.googleapis.com www.golem.de
confiant-integrations.global.ssl.fastly.net
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 s3.amazonaws.com www.golem.de
text
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 dmp.theadex.com lib.selfcampaign.com
confiant-integrations.global.ssl.fastly.net
2 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
2 lib.selfcampaign.com www.golem.de
2 de.ioam.de 1 redirects www.golem.de
2 ads.golem.de www.golem.de
1 adstax-match.adrtx.net confiant-integrations.global.ssl.fastly.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 ap-sync.nuggad.net
1 sak.userreport.com si.nuggad.net
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com confiant-integrations.global.ssl.fastly.net
1 js.adscale.de confiant-integrations.global.ssl.fastly.net
1 eu-u.openx.net cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 acdn.adnxs.com cdn-a.yieldlove.com
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ssl.1.damoh.golem.de text
1 s0.2mdn.net imasdk.googleapis.com
1 ad.yieldlab.net www.golem.de
1 cm.g.doubleclick.net 1 redirects
1 cdn.radiantmediatechs.com www.golem.de
1 d.agkn.com js.agkn.com
1 track.selfcampaign.com 1 redirects
1 delivery.selfcampaign.com lib.selfcampaign.com
1 stats.g.doubleclick.net www.golem.de
1 cdn.m6r.eu 1 redirects
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
1 adx.adform.net cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 cpx.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 si.nuggad.net cdn.stroeerdigitalgroup.de
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
1 golem.de 1 redirects
257 72
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
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
cdn-a.yieldlove.com
Amazon
2018-10-11 -
2019-11-11
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years 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-09-05 -
2019-11-28
3 months crt.sh
*.selfcampaign.com
Starfield Secure Certificate Authority - G2
2018-06-28 -
2020-07-28
2 years crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.google.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
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
*.googleapis.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
tracking.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-31 -
2019-11-29
3 months crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year 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
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 26 frames:

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

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
Frame ID: 193198026A24C3D88BE356DCE4397FC7
Requests: 1 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591411&bpp=9&bdt=698&fdt=123&idt=124&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=3010648819086&frm=20&pv=2&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=53025668992960&dssz=50&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4023&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12333&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.w008apgudsct&fsb=1&xpc=CYCj4zm8OV&p=https%3A//www.golem.de&dtd=139
Frame ID: 55D0F5B16291F3F6041A34E7F85B2482
Requests: 1 HTTP requests in this frame

Frame: https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Frame ID: B147E1D122C3A28538FD349B7395F97F
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=1569532591&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&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=1569532591421&bpp=3&bdt=708&fdt=235&idt=235&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&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=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.6lpqvdr548gs&fsb=1&dtd=240
Frame ID: 7BD5F7B6F20ECCB594EDDAAC9B4CE606
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=108260985&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&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: 39B7D8DF941D9BF5C4A02AC917B0B792
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591425&bpp=3&bdt=712&fdt=263&idt=263&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5169&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=2&uci=2.nodi8o8zkvvm&fsb=1&xpc=lUXEfagimf&p=https%3A//www.golem.de&dtd=266
Frame ID: D0D6A4D6F6ADBDF03C0A6E0F65F7EF55
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591428&bpp=3&bdt=715&fdt=279&idt=279&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0%2C520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5878&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=3&uci=3.ra3xeqszu7b7&fsb=1&xpc=ApZdD7lgoy&p=https%3A//www.golem.de&dtd=282
Frame ID: 6E3CD7D542FEBF922748EF7C63A37EB5
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.335.0_de.html
Frame ID: 7A9B09AC9FD6D2F6C4A992C14731F98D
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxi3lbFR_-jY7nybklOmt0OcRElamtYraReZpvrHo1csYvdc3PhnWrZR9LjFpeeYZIjcQm1T9_imqxYNNnDPgF2vFQFNpfvIAPL5TtpndQ6RlsJOiM2ebBAYDIuCZu5wGClSVwHVe6u1QtiDqqAROdNZlenRAF-AliAc2R1TJrQxtOc4sTIKA9Ad5hE-4UtOaZ7M6qI3vc8j1yNCwZHro-YJ8zp72okZagIpoF40TZzEu9vZwb-IM9PesbkpTcFJ0tsYIh4g64gkbeu4Vx5JUREiO1&sai=AMfl-YTQSpySCEFQWxVXmIe75deMMf5lQxVPYz48ox06BUcQPuwBREuVdRkSChLJbD50Lr81DSqhCUBrqIVVOCz5xDQBTcNYMnQP5efT4HFE&sig=Cg0ArKJSzIOtCGRezJODEAE&urlfix=1&adurl=
Frame ID: 58333216B8DDD90FDFCCF25579BDA551
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvPbTpSYCe01AMYES9dw5RNTIftr5Dj8r9R66WmlHHOFja-qQpcP1sj38SdSqIZcb5xamm04dOrvML_caFXG4QFoYlyusNzBFYzSDlJmxYOsKj6V4XlqkgzBk25qvD6mcHYVYNJW1z4EpbOtDpKb4L9hdZhXZgB0IPxHSVpIqXCf_xSiq9ReLY_PExK108L7ylkrbhymJd5NXmTSyOCWrnKXz-Ka0DwnYGEceAf6IDCsfDDFr1QgZyEZREm6-jyWEinpbQzW3CsQcRvybftJU1SMmRn&sai=AMfl-YTNIm-e4d6P_6cPRWNkvhUGEH0heUkXy_SdXW7bQOwFydU-TIP6RgHz55XgS88LCyz9A_w28MvI0jGmRzjkx1LBCWCyp7UGTQ6yVpgS&sig=Cg0ArKJSzJjVcpuPBLtGEAE&urlfix=1&adurl=
Frame ID: 41051D08785E94FBDD049AA89D58EE3C
Requests: 12 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsubzw7bPZtppTDv6f7-dC7QHcRugA4ehigNJ5E-uvy0Jr9mHwm3m9JCrh7Pr05N78v1upMNnljg4XZ7n9Ws6Kgs66B77E-iucL-SAnCixqt6QxPRIVTtjIaoO8rObo6P6XIyc2K37rHhJNIgzQRwJXHhF1d0NHxOKts_rTZU_OpJ69McG1gLqrJbximpSgQu4I2QkCruk7C07WUi-EGDhQCl7oZeYgEJkDQmZ-Tg-RxUYpT-qWKAaTmCdZq98D63PycWYET_6oDMHMTA1oGDkBrhOJS&sai=AMfl-YQTJPI-74h3RV4nzgXbAObd8gyhE7UZdteirXcJgZer-7wYBaor4aq9c2W5_8ArYm0rVwJRICi2iGKeufca5Sd0gPiJH8pQDVsk0jjq&sig=Cg0ArKJSzB_T7rCKiNf4EAE&urlfix=1&adurl=
Frame ID: 98A0EC9E8BE64E8F1A40BB2BF60B5CC4
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxoCfrbUhmxALsuRFNaqfm9GKdGoMfhBW0C9qudo5wtVGmQA1tkgS1v1q0FPDz998P5xqgZiAtkQPX381AW5JHxbcTnHMj1kywqNDUkHMyTffwd3OsybO7isNcEq4sW-TaE2OPEQiJbsOO1BIFUVkflVXBiePKtXl3aU7lM8OZRS8fJfTq9F6hmW-vinCRWz9rkb68gYscSSJzrAn5pk-iBN3VF-PiieRww1s1GzCgCDO166XYIGTLs-MhbHW_Fo1vKdvTDRGk12u7OkZryTu5MRz3&sai=AMfl-YR1X_58WKWXA4AxNNQ21mqZztcpMxlO-v-EsdnGnO6A43D_DFgFj6Vs4JlVXVrIAiLLYpUYAcZSJD57aogn6bMIZsLA8E26w_h2KX3q&sig=Cg0ArKJSzOy4deedC9tEEAE&urlfix=1&adurl=
Frame ID: 1F153B7FE40D56A6E6DB9B9DD3066DB6
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuhQYlyHmpSPJvMdovq-OfgKjGPkYhUP5IxVu9OxlhifBV4oXiQXZyijbtvjIX5H9VKKwejU0KOat55O_uvYfVH700tygQOWuMN_Wh58j6qK_AKn7vaNt3XNQe9be22JG-TBKtvy9ZUS10jn2OsndPaMt4IJyleY5m_INOFlYJXI0ZrreGvsOymOrN2oDRjZyiCk7WSvw94MfVVXv2W3JDRCVGeAmQqvmYpihkoEBet0OC8A4jr2tfY1UF6SYU5-KMm9UPW1C5Jq7D3hbc1OYILizqZ&sai=AMfl-YTY-5FlLcvU-gde3MK8ceYe_P9VlJ4DF5rRFSSFPcM-mP7MmzLEDvuVJ3v1CIfr3-gAFTNLZRxfX7YPDbvN-5NCkMMiHVpimBSoOSLq&sig=Cg0ArKJSzKgFAYSPk0CqEAE&urlfix=1&adurl=
Frame ID: 0FD6362D4E1871D1EE531946F96E3BED
Requests: 10 HTTP requests in this frame

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

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

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

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

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

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

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

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

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
Frame ID: 2187B14FE58CB85ED5E31A810CF3FD4D
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4205021767115897261
Frame ID: 0650B782F90CA1E7B4D6879E96CA1075
Requests: 1 HTTP requests in this frame

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

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

Page Statistics

257
Requests

100 %
HTTPS

29 %
IPv6

43
Domains

72
Subdomains

59
IPs

9
Countries

3553 kB
Transfer

7315 kB
Size

1
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://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 24
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 40
  • 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=GB%2FLondon%2C%20City%20of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=415&id=sxnjyl&i3=0010f1c16c0da27aa5d8d2aae%3A1598908591323%3A1569532591323%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1569532591323&n1=1&dntt=0&lt=1569532591324&ev=&cs=s52021&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=GB%2FLondon%2C+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=415&id=sxnjyl&i3=0010f1c16c0da27aa5d8d2aae%3A1598908591323%3A1569532591323%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1569532591323&n1=1&dntt=0&lt=1569532591324&ev=&cs=s52021&mo=1&sr=71
Request Chain 117
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 124
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=697807570&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=IEBAAUAB~&jid=1825927787&gjid=242470550&cid=1000541211.1569532592&tid=UA-518800-2&_gid=2066517412.1569532592&_r=1&gtm=2ou9i1&z=2092728431 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
Request Chain 135
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27 HTTP 302
  • https://track.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
Request Chain 136
  • https://c1.adform.net/serving/cookie/match?party=1173 HTTP 302
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=4748142316282753057&source=adform
Request Chain 166
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=9664750850da4a7ea349481a66605ec3 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=db8a8c8e52a674ed14f1ecabf02a0091&userId=adscale-user:9664750850da4a7ea349481a66605ec3
Request Chain 167
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=db8a8c8e52a674ed14f1ecabf02a0091
Request Chain 168
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=24qMjlKmdO0U8eyr8CoAkQ HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 169
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=db8a8c8e52a674ed14f1ecabf02a0091
Request Chain 260
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
Request Chain 267
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESasBDwABiw3BsUkWsfABifABSfABSfABiUABifABfrr&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=4205021767115897261

257 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://www.golem.de/
188 KB
43 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
415259ebdbe30832ba0a86e5ec994a83938ce0e8361d12a7fce02c34384ea131
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
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
Thu, 26 Sep 2019 21:16:30 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=Fri, 27-Sep-2019 09:16:30 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-f7de32722ed517c93a0dfbb11ff42340"
Content-Encoding
gzip
Vary
Accept-Encoding
X-UPSTREAM
unix:/var/run/php-fpm-www.sock

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_130-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_130-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Content-Encoding
gzip
Last-Modified
Wed, 05 Jun 2019 18:13:08 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
Sun, 27 Oct 2019 21:16:30 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
249 KB
61 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.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:18a::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
cf70c14844aa0b7431e66c5febfd3799f3fc88d8795ed8e250fe8754cf8a9365

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
content-encoding
gzip
vary
Accept-Encoding
x-amz-request-id
856A66B77BA4F3F6
status
200
content-length
61622
x-amz-id-2
NeV3Msf9DIBh/1mNQv2bEc51xriII2g530Zrp9naEUcdizodQwuhdGL9eF67EQyUsuzMC53EGWM=
last-modified
Thu, 26 Sep 2019 15:04:10 GMT
server
KONICHIWA/1.0
etag
"3b10a601e4bdc8209f29d7e4e6ddd4a7"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=564
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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Sun, 27 Oct 2019 21:16:30 GMT
143433-209336-209334_rc.jpg
www.golem.de/1909/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1909/143433-209336-209334_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
61b68cc4920e75493ba894cfbf37558ab9d6fdff42107532b869da59ea6abf5e

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 10:10:03 GMT
Server
nginx
ETag
"5d8c8e7b-423b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16955
Expires
Sun, 27 Oct 2019 21:16:30 GMT
144125-210038-210035_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144125-210038-210035_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
84b21737e9bdf0817af9da35e76e2cdcba563c4f3dbfdab97f3d47f04501d881

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 16:42:03 GMT
Server
nginx
ETag
"5d8cea5b-2143"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8515
Expires
Sun, 27 Oct 2019 21:16:30 GMT
144124-210042-210039_rc.jpg
www.golem.de/1909/
12 KB
13 KB
Image
General
Full URL
https://www.golem.de/1909/144124-210042-210039_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fc52f51348696d05b5f25877845497269d3ee06a3744b55d747a088eab39ac76

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 16:30:04 GMT
Server
nginx
ETag
"5d8ce78c-30e0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
12512
Expires
Sun, 27 Oct 2019 21:16:30 GMT
144082-209827-209826_rc.jpg
www.golem.de/1909/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1909/144082-209827-209826_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c351b8b801dc14d4fe2b97fbc29a71c4f9ea069718616f1abcdcee231dd74b2

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 15:00:04 GMT
Server
nginx
ETag
"5d8cd274-1a90"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6800
Expires
Sun, 27 Oct 2019 21:16:30 GMT
144122-210025-210024_rc.jpg
www.golem.de/1909/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1909/144122-210025-210024_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6b0fc1df9ae80ce09cfd696aa086c1228f09197c359fdc01f6e0129522acdc3a

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 15:50:03 GMT
Server
nginx
ETag
"5d8cde2b-1073"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4211
Expires
Sun, 27 Oct 2019 21:16:30 GMT
144090-209944-209941_rc.jpg
www.golem.de/1909/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1909/144090-209944-209941_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1e54578861eb9b537e524171eebda0b0e1fd4fcf7f05e0d7edfc4eb61c3b3590

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 26 Sep 2019 08:53:04 GMT
Server
nginx
ETag
"5d8c7c70-1a14"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6676
Expires
Sun, 27 Oct 2019 21:16:30 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=1569532142&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

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 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
the-last-of-us-part-ii-8211-trailer.jpg
video.golem.de/teaser/1/1/23539/thumb-high-1000/
119 KB
119 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23539/thumb-high-1000/the-last-of-us-part-ii-8211-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
9437105216b40072cb0e46abbd437b2fda0c55456f88ac9cc205c7d6d291b44a

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Wed, 25 Sep 2019 06:24:25 GMT
Server
nginx
ETag
"5d8b0819-1dc90"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
122000
Expires
Sun, 27 Oct 2019 21:16:30 GMT
maxresdefault.jpg
video.golem.de/teaser/1/1/23540/thumb-high-1000/
144 KB
144 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23540/thumb-high-1000/maxresdefault.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
da60b73a6ac5cdaae68aeab1b9a4d672a153e206e8f26c879f6c0778633a5c05

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Wed, 25 Sep 2019 10:31:10 GMT
Server
nginx
ETag
"5d8b41ee-23f6c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
147308
Expires
Sun, 27 Oct 2019 21:16:30 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=1569531241&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

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 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
144026-209581-209580_rc.jpg
www.golem.de/1909/
89 KB
89 KB
Image
General
Full URL
https://www.golem.de/1909/144026-209581-209580_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b649471785908e92f637304d91f26ad0316639d9e60cf8eb28173a649bf08e7a

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Tue, 24 Sep 2019 09:58:04 GMT
Server
nginx
ETag
"5d89e8ac-1627c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
90748
Expires
Sun, 27 Oct 2019 21:16:30 GMT
142430-201810-201807_rc.jpg
www.golem.de/1907/
112 KB
112 KB
Image
General
Full URL
https://www.golem.de/1907/142430-201810-201807_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0329ae2d10162ba48206d0f090f9e60ef881baf24b7723d4df74cbb368bede9c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Thu, 11 Jul 2019 10:14:05 GMT
Server
nginx
ETag
"5d270bed-1bf76"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
114550
Expires
Sun, 27 Oct 2019 21:16:30 GMT
190923-golem_Seminar_Zeitmanagment_m.jpg
www.golem.de/_img/
144 KB
144 KB
Image
General
Full URL
https://www.golem.de/_img/190923-golem_Seminar_Zeitmanagment_m.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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
39d7ac9761700bbcb36948782f8508d446832fcb48b71c04c0ff56ed10457639

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Last-Modified
Mon, 23 Sep 2019 19:57:57 GMT
Server
nginx
ETag
"5d8923c5-23fc9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
147401
Expires
Sun, 27 Oct 2019 21:16:30 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:30 GMT
longread-swiper_131-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_131-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:10 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
Sun, 27 Oct 2019 21:16:30 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
576 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:30 GMT
Content-Encoding
gzip
Last-Modified
Thu, 26 Sep 2019 21:16:30 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
Sat, 26 Jul 1997 05:00:00 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

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 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
Sun, 27 Oct 2019 21:16:30 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.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0010
Resource Hash
88463164952c61d41850bf7c7630d97312292e8a16e6857f7d6f4e3a2e87181f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:30 GMT
Content-Encoding
gzip
Last-Modified
Thu, 26 Sep 2019 21:16:30 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0010
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Thu, 26 Sep 2019 23:16:30 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
44 KB
14 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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 283 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
274 KB
84 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
143.204.214.67 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-67.fra53.r.cloudfront.net
Software
/ Express
Resource Hash
f747e9ab9f364435dbc86dfefe89f21e75b8669e392cbea1b34338037045359e

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 18:21:37 GMT
content-encoding
gzip
age
10494
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
AZtQU5ViP3NOJX8c_LV7CHRDM5wPR6qEHrmqaqRQ5rc2jPOH3iyvKA==
via
1.1 85dc19f43b2a0bd8840fdf8baf07d762.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: 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
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Thu, 26 Sep 2019 23:16:31 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
600 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.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
d31249078d40c63c95f9aff16dec0ec0e93a9026032c09f3837a74813342628f

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
Thu, 26 Sep 2019 21:16:31 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
108

Redirect headers

Date
Thu, 26 Sep 2019 21:16:31 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
rc
si.nuggad.net/
2 KB
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
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, RSA, AES_128_CBC
Server
80.82.201.88 Berlin, Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
pbtgx-nuggad.unbelievable-machine.net
Software
Apache /
Resource Hash
c80dba27ba5805b5565f6c7ac253adf27c17ec2c79ee2a035131e27dd9122710

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Cache-Control
no-store,no-cache
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Content-Length
615
Expires
Wed, 18 Feb 2009 11:53:30 GMT
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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Sec-Fetch-Mode
cors
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Sec-Fetch-Mode
cors
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Sec-Fetch-Mode
cors
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
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
21448
Expires
Sun, 27 Oct 2019 21:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Sec-Fetch-Mode
cors
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 GMT
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
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: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Mon, 08 Apr 2019 18:48:10 GMT
Server
nginx
ETag
"5cab976a-b0e"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Sun, 27 Oct 2019 21:16:31 GMT
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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Sec-Fetch-Mode
cors
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
100 KB
35 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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
53fa685c240745b73907db2bdb60fb752bcefb7f6ec9141fd1a739a1997e82c1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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"
content-length
36177
x-xss-protection
0
server
cafe
etag
14750291838272485703
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Thu, 26 Sep 2019 21:16:31 GMT
golem_csi-121-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-121-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:31 GMT
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=7489838578335251&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

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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
Sun, 27 Oct 2019 21:16:31 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=GB%2FLondon%2C%20City%20of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&...
  • 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=GB%2FLondon%2C+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=4...
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=GB%2FLondon%2C+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=415&id=sxnjyl&i3=0010f1c16c0da27aa5d8d2aae%3A1598908591323%3A1569532591323%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1569532591323&n1=1&dntt=0&lt=1569532591324&ev=&cs=s52021&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.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 002b
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
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 002b
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 002b
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
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=GB%2FLondon%2C+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=415&id=sxnjyl&i3=0010f1c16c0da27aa5d8d2aae%3A1598908591323%3A1569532591323%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1569532591323&n1=1&dntt=0&lt=1569532591324&ev=&cs=s52021&mo=1&sr=71
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
Wed, 26 Sep 2018 21:16:31 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
142.93.164.12 Frankfurt am Main, Germany, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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
Fri, 27 Sep 2019 14:19:23 GMT
js
www.googletagmanager.com/gtag/
69 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:814::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
eec9b9615aec3514cc96a56e9ac20f789d5fbe3eee4372791e758d815670c978
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
br
last-modified
Thu, 26 Sep 2019 21:00:00 GMT
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
27151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
146005_67aa4bdf07fc8a6dd839add1ec7302a1
lib.selfcampaign.com/tag/
10 KB
4 KB
Script
General
Full URL
https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
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
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
298cdc0ceb83b57b46111f625115741bb82981b53f0d4894840e875ca08391b0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
nginx/1.14.0 (Ubuntu)
Transfer-Encoding
chunked
Content-Type
text/javascript; charset=utf-8
X-Request-Id
69a09a55-9737-4345-90f6-34f8152875af
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Connection
keep-alive
Vary
Accept-Encoding
X-XSS-Protection
1; mode=block
X-Runtime
0.021879
Expires
Fri, 01 Jan 1990 00:00:00 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:20bb:a200:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 15:50:01 GMT
via
1.1 2fe707f3cc1dc569687bcdf81697e284.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
19605
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA56
accept-ranges
bytes
content-length
3167
x-amz-cf-id
NoEe7PNGfCgQDDlETDICqPe-z5E2ebbj12CzZi_A0ZWKDMC84LzkGA==
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
77.247.84.129 , 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
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:31 GMT
11promax2-snap.jpg
video.golem.de/teaser/1/1/23531/thumb-high-1000/
75 KB
75 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23531/thumb-high-1000/11promax2-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
67e989044afb1b22e322e83aed6a373784d391e9613ee84f551441e81224be23

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 24 Sep 2019 14:23:23 GMT
Server
nginx
ETag
"5d8a26db-12c26"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
76838
Expires
Sun, 27 Oct 2019 21:16:31 GMT
bmw-x6-series-in-vanta-schwarz-der-dunkelsten-moeglichen-lackierung.jpg
video.golem.de/teaser/1/1/23525/thumb-high-1000/
51 KB
51 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23525/thumb-high-1000/bmw-x6-series-in-vanta-schwarz-der-dunkelsten-moeglichen-lackierung.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
0d226045d76e8f0e97363ffee3ef7baf7da4ffd968eb0b496a3e82e048eff601

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 24 Sep 2019 04:24:13 GMT
Server
nginx
ETag
"5d899a6d-ca5a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
51802
Expires
Sun, 27 Oct 2019 21:16:31 GMT
quest-snap.jpg
video.golem.de/teaser/1/1/23553/thumb-high-1000/
58 KB
58 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23553/thumb-high-1000/quest-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
022a16522ee47a29b02fac58a343eb73953f23a27949e98ae1991f220912a393

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 19:08:05 GMT
Server
nginx
ETag
"5d8bbb15-e6a7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
59047
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144123-210029-210026_rc.jpg
www.golem.de/1909/
11 KB
12 KB
Image
General
Full URL
https://www.golem.de/1909/144123-210029-210026_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
af0caaa76a3f65f64191491dbe470581ff3de976d4ad61bc8b37fb8a2e176d56

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 16:14:03 GMT
Server
nginx
ETag
"5d8ce3cb-2cd4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11476
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144112-209979-209976_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144112-209979-209976_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f4599d4eb5179ddffa24255aeee6766cc7415e5a4c9ae2a75b7969887591a7be

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 12:00:03 GMT
Server
nginx
ETag
"5d8ca843-21a5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8613
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144108-209957-209954_rc.jpg
www.golem.de/1909/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1909/144108-209957-209954_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f2c4bcca2fea5da786b4a3bf39fe254353065823d20ddcfa5f6fedb48eea8d0f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 09:21:03 GMT
Server
nginx
ETag
"5d8c82ff-11c9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4553
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144121-210019-210018_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144121-210019-210018_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c62418058518c2cf060ee5bcb552a1f7c5e469fef847df36f5ed6679ba5972b4

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 15:13:03 GMT
Server
nginx
ETag
"5d8cd57f-20c2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8386
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144106-209949-209946_rc.jpg
www.golem.de/1909/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1909/144106-209949-209946_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2896a1ed19d811cf074c327eb1b69c9c973df6849a23cb476969e8a745c76faf

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 08:17:04 GMT
Server
nginx
ETag
"5d8c7400-20ae"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8366
Expires
Sun, 27 Oct 2019 21:16:31 GMT
143888-208882-208878_rc.jpg
www.golem.de/1909/
107 KB
108 KB
Image
General
Full URL
https://www.golem.de/1909/143888-208882-208878_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
aad2e34518af325b26e993ae78d072b1852b697faea8475f93e4a2126f0c79d5

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 24 Sep 2019 07:20:04 GMT
Server
nginx
ETag
"5d89c3a4-1adcd"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
110029
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144120-210007-210006_rc.jpg
www.golem.de/1909/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144120-210007-210006_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
503ca57c58bc0eeb4f64839186626d02ca2617b119ec31e6342125888c1a28da

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 15:12:03 GMT
Server
nginx
ETag
"5d8cd543-22ae"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8878
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144099-209904-209900_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144099-209904-209900_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e60f2e84479ef84b6dab41e801c595126f555f938d47e6a344ab7d5cfb112061

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 07:01:04 GMT
Server
nginx
ETag
"5d8c6230-172a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5930
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144118-210014-210011_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144118-210014-210011_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
87bbd02296d2b50d705c201ea632dd6dfc14cc3030f5e2929f37ef5e38ca6a96

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 14:45:03 GMT
Server
nginx
ETag
"5d8cceef-1821"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6177
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144071-209783-209779_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144071-209783-209779_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
32e6a5ef7661af8355c2d16b1b5704714e3285cd594c6692fc77f1136b2dba30

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 08:39:03 GMT
Server
nginx
ETag
"5d8b27a7-20c2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8386
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144086-209840-209839_rc.jpg
www.golem.de/1909/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1909/144086-209840-209839_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a41beb90930c67ea6f4c9587e11a265a74ab450c8644f52e8f13ce4ce33bf4b8

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 14:09:03 GMT
Server
nginx
ETag
"5d8b74ff-1e93"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7827
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144119-210005-210002_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144119-210005-210002_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b1a88f9bb26d1a882acdbd2cae1799a4d199bcadc2e981efbb6eea116066837c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 14:35:04 GMT
Server
nginx
ETag
"5d8ccc98-21c0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8640
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144114-209993-209990_rc.jpg
www.golem.de/1909/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144114-209993-209990_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c4b1207f3967b6dbbc322db1ed797c2cd78f243104fc5d02ad87e5ae46562167

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 12:28:03 GMT
Server
nginx
ETag
"5d8caed3-2373"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9075
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144116-210001-209998_rc.jpg
www.golem.de/1909/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1909/144116-210001-209998_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
70444a9702dd4e5190f40322d8d8dabe753d3e9511304c4429081ee2071769d1

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 12:49:03 GMT
Server
nginx
ETag
"5d8cb3bf-1caf"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7343
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144054-209699-209696_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144054-209699-209696_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6c0deeeb12982848ccc0ee06a8483790bfcfc070b91fcd6c50660aab76ca39d7

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 24 Sep 2019 11:40:03 GMT
Server
nginx
ETag
"5d8a0093-1849"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6217
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144062-209732-209729_rc.jpg
www.golem.de/1909/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144062-209732-209729_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a8741b8d6dbfc97f2eabdbce8c478ad25570f974f0511269548f172b092a4f9c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 05:00:03 GMT
Server
nginx
ETag
"5d8af453-216d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8557
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144113-209984-209981_rc.jpg
www.golem.de/1909/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/1909/144113-209984-209981_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0a2ea8c3c7a4eb2dafba322201da75ae16775eb5568939e0845f41be420f9dd5

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 11:16:04 GMT
Server
nginx
ETag
"5d8c9df4-c43"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3139
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144111-209975-209972_rc.jpg
www.golem.de/1909/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1909/144111-209975-209972_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
aea60f8e73e6cee0500383aab78ad431cfc702c4cbae6e0eac19dcd40d57513e

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 09:54:03 GMT
Server
nginx
ETag
"5d8c8abb-2523"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9507
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144110-209971-209966_rc.jpg
www.golem.de/1909/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144110-209971-209966_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6d44a82c974768ad9c36b4c00848316f95b6351fc52d1cc7304e157c0c151358

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 09:41:03 GMT
Server
nginx
ETag
"5d8c87af-15f5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5621
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144109-209965-209962_rc.jpg
www.golem.de/1909/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1909/144109-209965-209962_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b13eadabd41e1b23377f63d5092938030299b6e27c2867538e9d2425cd107c36

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 09:30:04 GMT
Server
nginx
ETag
"5d8c851c-1bfb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7163
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144095-209882-209879_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144095-209882-209879_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6002360e1135016056737bf27c3c07441b6343369c58ea262652f66901c0831d

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 18:30:05 GMT
Server
nginx
ETag
"5d8bb22d-16ee"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5870
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144105-210044-210043_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144105-210044-210043_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4d6578dd4fdcafe647cd6a7dd62ec29711ed5bc7bb7f0631c7f979f0b7e0696f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 18:30:03 GMT
Server
nginx
ETag
"5d8d03ab-1738"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5944
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144107-209953-209950_rc.jpg
www.golem.de/1909/
12 KB
12 KB
Image
General
Full URL
https://www.golem.de/1909/144107-209953-209950_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
37d6d96c37563f3f7820e4ff7f217ce15003dabb53a9283790adb0a0e152f171

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 08:33:03 GMT
Server
nginx
ETag
"5d8c77bf-2ecc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11980
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144104-209929-209928_rc.jpg
www.golem.de/1909/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1909/144104-209929-209928_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f0d4cadedff445959733d5072fa87ea6242d8611f91c3ca18260cb1f19a7369c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 07:30:04 GMT
Server
nginx
ETag
"5d8c68fc-2245"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8773
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144103-209920-209917_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144103-209920-209917_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
def996c26badf06db6f6fbc63c17a8b274a4ad6bd7a321a5c846478c673e138c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 06:39:03 GMT
Server
nginx
ETag
"5d8c5d07-17b1"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6065
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144064-209741-209738_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144064-209741-209738_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e4c6ca3d20bdb0f2409a1bf91b96064b53a7fe4eebf043b35b53d13573c1ecaa

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 07:03:04 GMT
Server
nginx
ETag
"5d8b1128-16e0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5856
Expires
Sun, 27 Oct 2019 21:16:31 GMT
143951-209924-209921_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/143951-209924-209921_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3561cf4c1aab3cef0a647d104655ab496ac13302127ef88e9e1d5faa451de455

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 06:24:03 GMT
Server
nginx
ETag
"5d8c5983-188b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6283
Expires
Sun, 27 Oct 2019 21:16:31 GMT
144073-209789-209788_rc.jpg
www.golem.de/1909/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1909/144073-209789-209788_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
317b2956ed1d4fbe5a078e6f2fa95e653b43d9458b7672a77b3ec116f08db4f7

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 25 Sep 2019 10:13:04 GMT
Server
nginx
ETag
"5d8b3db0-1b74"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7028
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143339-206175-206173_rc.jpg
www.golem.de/1909/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143339-206175-206173_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c3688c4f3558318584c10d651297832000a94af276da9288d74045a69a85c17f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Fri, 20 Sep 2019 12:49:05 GMT
Server
nginx
ETag
"5d84cac1-3e08"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15880
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143931-209149-209147_rc.jpg
www.golem.de/1909/
28 KB
29 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143931-209149-209147_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0cf30fef0fab894e55602dccf3099fa7c19b13a6f97e84d4d498a532b5a6c725

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 19 Sep 2019 07:26:04 GMT
Server
nginx
ETag
"5d832d8c-7185"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29061
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143856-208699-208697_rc.jpg
www.golem.de/1909/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143856-208699-208697_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1a2d672618e60c667ce620319f392ae45207f2c77c60299ffb5290210b150c53

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 19 Sep 2019 14:09:05 GMT
Server
nginx
ETag
"5d838c01-7233"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29235
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143883-209167-209165_rc.jpg
www.golem.de/1909/
21 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143883-209167-209165_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ab50a271594ffad54cda02ba744a01d5ba587b6ec47986ac6fab5270b4b11fec

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 19 Sep 2019 10:03:05 GMT
Server
nginx
ETag
"5d835259-55ab"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21931
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143693-209143-209141_rc.jpg
www.golem.de/1909/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143693-209143-209141_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
168a22846aba37d45ba1c76c155db3ccc9ee0e544438182876f8f860f72c043b

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Fri, 20 Sep 2019 06:43:05 GMT
Server
nginx
ETag
"5d8474f9-56be"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22206
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143579-207305-207303_rc.jpg
www.golem.de/1909/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143579-207305-207303_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3d0e20e960d26b6b610d648198b6b410c230d5f3e59fc32cb0464e69592deb5c

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 17 Sep 2019 10:00:05 GMT
Server
nginx
ETag
"5d80aea5-50a6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20646
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143337-206210-206208_rc.jpg
www.golem.de/1909/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143337-206210-206208_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9db81a132055cf6cc54a888c59269a0041d0908f209ff15aa83a706a0ddc250f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Fri, 20 Sep 2019 10:04:05 GMT
Server
nginx
ETag
"5d84a415-57c9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22473
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143869-209035-209033_rc.jpg
www.golem.de/1909/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143869-209035-209033_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e1e6886dad3b0fede3b020f6afd66a46cc956cdd091e9860421d291b5c38540b

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 18 Sep 2019 06:26:05 GMT
Server
nginx
ETag
"5d81cdfd-453a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17722
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143911-209045-209043_rc.jpg
www.golem.de/1909/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143911-209045-209043_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6801ebae500fcd26fdc58c210f4248da89434391affc6809b8855916c023c3f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 18 Sep 2019 07:12:05 GMT
Server
nginx
ETag
"5d81d8c5-47c8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18376
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143887-208904-208902_rc.jpg
www.golem.de/1909/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143887-208904-208902_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0b514fb40e458e04357ffd31004c6e84b6b06eb75aa9f4fccdfacd5b0d5b3092

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 17 Sep 2019 13:00:11 GMT
Server
nginx
ETag
"5d80d8db-4e16"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
19990
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_141916-205507-205505_rc.jpg
www.golem.de/1909/
24 KB
25 KB
Image
General
Full URL
https://www.golem.de/1909/sp_141916-205507-205505_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2fa4c073f1014a9bc165374be7ebc2a1cfce3dcfe33e2369830b64bd8524cbd6

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Mon, 16 Sep 2019 10:02:04 GMT
Server
nginx
ETag
"5d7f5d9c-60cd"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24781
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143756-209089-209087_rc.jpg
www.golem.de/1909/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143756-209089-209087_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
06add06f48aca05d5f8c36f1a3caf176a423d1fe8f2635bab701ca6c4879ef3d

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 18 Sep 2019 10:02:05 GMT
Server
nginx
ETag
"5d82009d-4955"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18773
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143919-209014-209012_rc.jpg
www.golem.de/1909/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143919-209014-209012_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
56e1b70b247005fe0bbe144a844c21edf8342cca00393e61a7e493572ef54ac7

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 18 Sep 2019 05:00:05 GMT
Server
nginx
ETag
"5d81b9d5-6486"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
25734
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143908-208983-208979_rc.jpg
www.golem.de/1909/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143908-208983-208979_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
13acf701f508a52f8bdd15ee734de2f70e652369ff4c117e4709ec8e4235a9fb

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Wed, 18 Sep 2019 13:00:05 GMT
Server
nginx
ETag
"5d822a55-45cb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17867
Expires
Sun, 27 Oct 2019 21:16:31 GMT
sp_143804-208899-208897_rc.jpg
www.golem.de/1909/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143804-208899-208897_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
748de7889eacf85fc014b76171e37d2544fbf9d7598e20d2c5d5394e7653b360

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 17 Sep 2019 12:00:07 GMT
Server
nginx
ETag
"5d80cac7-681a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26650
Expires
Sun, 27 Oct 2019 21:16:31 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1569532591&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
77.247.84.149 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 GMT
Last-Modified
Thu, 26 Sep 2019 21:16:31 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
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 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: 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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
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: 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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
104
x-xss-protection
0
pubads_impl_2019091901.js
securepubads.g.doubleclick.net/gpt/
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
arj
yieldlove-d.openx.net/w/1.0/
11 KB
11 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=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=b49401bf-5b42-44e9-87a9-9741f6455268%2Cef3a7607-7981-4975-82c8-3e65ddc05bc3%2Ce9a0f925-cd6c-40a4-a103-4cdb7b6e608a%2Ccc9a537a-e5cb-4e25-983c-8e6a74627a16%2C59dea03d-47ca-42aa-adb4-55ff45151a7b&nocache=1569532591397&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.163.0 /
Resource Hash
8f71ee3131396059a7ce4ea2285bdf44944d113039168046e56f5397342d634c

Request headers

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

Response headers

pragma
no-cache
date
Thu, 26 Sep 2019 21:16:31 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
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
10773
expires
Mon, 26 Jul 1997 05:00:00 GMT
/
adx.adform.net/adx/
10 B
407 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWVmM2E3NjA3LTc5ODEtNDk3NS04MmM4LTNlNjVkZGMwNWJjMw%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPWNjOWE1MzdhLWU1Y2ItNGUyNS05ODNjLThlNmE3NDYyN2ExNg%3D%3D&pt=gross&stid=8ec1d207-0c3e-4bd7-ad54-81554b1ace94&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.40 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3

Request headers

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

Response headers

pragma
no-cache
date
Thu, 26 Sep 2019 21:16:31 GMT
server
nginx
status
200
access-control-max-age
86400
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
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
content-length
10
expires
-1
v1
dmx.districtm.io/b/
0
397 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

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

Response headers

date
Thu, 26 Sep 2019 21:16:31 GMT
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin
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
51c842699e2235d0-LHR
access-control-allow-headers
origin, content-type
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349738&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=b49401bf-5b42-44e9-87a9-9741f6455268&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.834999949319484
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, RSA, AES_128_GCM
Server
69.173.144.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
e44bcc635acacf68bb36e748a30962fcb6608ddf2b052ed7aec5b3e3eaceb02f

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=470
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
3 KB
3 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1218740&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=ef3a7607-7981-4975-82c8-3e65ddc05bc3&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.29433581531074604
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, RSA, AES_128_GCM
Server
69.173.144.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
4a16db7713ec94f2f9b11c587fa12f4c89c84097b10a542293c0da1d229e2371

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=255
Content-Length
1457
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349732&size_id=15&alt_size_ids=10&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=e9a0f925-cd6c-40a4-a103-4cdb7b6e608a&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.835436736823743
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, RSA, AES_128_GCM
Server
69.173.144.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
d1f113f4227720d00bfd0f59c290c95f3a56201167663e0864b7658d6bb7ac5c

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=365
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349674&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=cc9a537a-e5cb-4e25-983c-8e6a74627a16&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6480901518076088
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, RSA, AES_128_GCM
Server
69.173.144.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
62d19b29386236267f264d98258a648c4f402fdf4c67d12140cf354f9d926af2

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=319
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
v1
prg.smartadserver.com/prebid/
0
319 B
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.79 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
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
319 B
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.79 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:30 GMT
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
319 B
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.79 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
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
319 B
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.79 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
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
prebid
ib.adnxs.com/ut/v3/
483 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.83 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
250.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
791d71816be1d825f725979243295c0745a24fc07fd75a859a71cc06fc73ca71
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:33 GMT
X-Proxy-Origin
81.92.200.118; 81.92.200.118; 250.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.75:80
AN-X-Request-Uuid
49f22ed9-093e-4b22-b6fe-717c85418e01
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
483
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
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%2230f1e8ad3702df5%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2231a540d8afd0031%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%2232891e93bb6d98b%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%22334a0a04cca8b3a%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%2234da05d832225db%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%223508c3eb3198fff%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%223695c2ae8e09e9d%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%22373d2e53405eb0b%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%2238f505a2bbd2161%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%2239c1a1861314278%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%224000afe46817b54%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%2241cde38819db15c%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%22428b05528c92b0d%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
2.18.234.21 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
05cc76cf8ecc468b9960df4a8a354a44784d440277c8223994fe29dd2e1ebcc7

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 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
Thu, 26 Sep 2019 21:16:31 GMT
sp_ojOH-704085_rc.jpg
www.golem.de/5976/
68 B
463 B
Image
General
Full URL
https://www.golem.de/5976/sp_ojOH-704085_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 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
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/
227 KB
84 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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"
content-length
85560
x-xss-protection
0
server
cafe
etag
13535242702471442266
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 26 Sep 2019 21:16:31 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/ Frame 1931
227 KB
84 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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"
content-length
85560
x-xss-protection
0
server
cafe
etag
13535242702471442266
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 26 Sep 2019 21:16:31 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190924/r20190131/ Frame 7E9C
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190924/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:80b::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/r20190924/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
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
Tue, 24 Sep 2019 14:02:11 GMT
expires
Tue, 08 Oct 2019 14:02:11 GMT
content-type
text/html; charset=UTF-8
etag
2890223722171781336
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7315
x-xss-protection
0
cache-control
public, max-age=1209600
age
198860
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
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:80b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
3033
date
Thu, 26 Sep 2019 20:25:58 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"
content-length
17803
expires
Thu, 26 Sep 2019 22:25:58 GMT
submit
lb80.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb80.s400.meetrics.net/bb-mx/submit?/wTLZBTAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSLBDPAAAAAAAAAOAAAAGBAAAAAAZwSLBDBRksFAQtjFBQ8qSA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Thu, 26 Sep 2019 21:16:30 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZCUAAATkzFARksFAQtjFPtJNSA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:30 GMT
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Sep 2019 12:52:07 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Thu, 26 Sep 2019 21:16:31 GMT
rmpslider-rl_131-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_131-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698

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
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:27 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
Sun, 27 Oct 2019 21:16:31 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/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 26 Sep 2019 21:16:31 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/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 26 Sep 2019 21:16:31 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/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 26 Sep 2019 21:16:31 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/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 26 Sep 2019 21:16:31 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/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 26 Sep 2019 21:16:31 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"
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=697807570&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=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
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=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
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
date
Thu, 26 Sep 2019 21:16:31 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-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
Thu, 26 Sep 2019 21:16:31 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43"
content-length
417
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=697807570&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=1041&_u=IEBAAUAB~&jid=&gjid=&cid=1000541211.1569532592&tid=UA-518800-2&_gid=2066517412.1569532592&gtm=2ou9i1&z=658753158
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::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
Fri, 23 Aug 2019 04:51:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2996685
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 55D0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591411&bpp=9&bdt=698&fdt=123&idt=124&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=3010648819086&frm=20&pv=2&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=53025668992960&dssz=50&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4023&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12333&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.w008apgudsct&fsb=1&xpc=CYCj4zm8OV&p=https%3A//www.golem.de&dtd=139
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591411&bpp=9&bdt=698&fdt=123&idt=124&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=3010648819086&frm=20&pv=2&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=53025668992960&dssz=50&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4023&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12333&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.w008apgudsct&fsb=1&xpc=CYCj4zm8OV&p=https%3A//www.golem.de&dtd=139
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:31 GMT
server
cafe
content-length
20155
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 26-Sep-2019 21:31:31 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"
expires
Thu, 26 Sep 2019 21:16:31 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 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/r20190924/r20190131/show_ads_impl.js?cache=bust
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29169
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
ads
securepubads.g.doubleclick.net/gampad/
395 B
702 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1091313496313169&correlator=1755006320471485&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&eid=20040008%2C21062452%2C21064212%2C21064216&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn3-1%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-noanswer&cookie_enabled=1&bc=31&abxe=1&lmt=1569532591&dt=1569532591577&dlt=1569532590713&idt=846&frm=20&biw=1585&bih=1200&oid=3&adxs=393&adys=2872&adks=3564596220&ucis=1&ifi=5&u_tz=120&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=51&icsg=615975622414272&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x450&msz=1000x450&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&fws=0&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
25cfc5d790d9aca4249fa5b36317cd0679518d62372a32c426d5cd7e9c778e79
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:31 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
211
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_2019091901.js
securepubads.g.doubleclick.net/gpt/
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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

ads
securepubads.g.doubleclick.net/gampad/
60 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1091313496313169&correlator=1755006320471485&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&eid=20040008%2C21062452%2C21064212%2C21064216&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&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%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%2C20x10%7C20x15%7C30x10%7C30x15%7C40x10%7C40x15%7C80x10%7C80x15%7C100x10%7C100x13%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C10x11%7C301x250%7C300x126&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17298.default%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%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17295.default%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17299.default%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%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A18494.default%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%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17300.default%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn3-1%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-noanswer&cookie_enabled=1&bc=31&abxe=1&lmt=1569532591&dt=1569532591600&dlt=1569532590713&idt=846&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C1138&adys=0%2C130%2C768%2C1383%2C4419&adks=3744015188%2C2546325955%2C1693156142%2C1158153011%2C3764920871&ucis=3%7C4%7C5%7C6%7C7&ifi=7&u_tz=120&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=52&icsg=2867775436099520&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e712b1ffac15cd104dceac573c53b307b08591cb2fea24a56897d0ba5f7c9f98
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
7888
x-xss-protection
0
google-lineitem-id
4889676871,4889797896,4889680744,4890373424,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138267872638,138267578040,138267872656,138263529492,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
Cookie set frame
delivery.selfcampaign.com/tag/146005/ Frame B147
0
0
Document
General
Full URL
https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Host
delivery.selfcampaign.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
_auid=7ca7fab338920cc37f2b2371913d9c27
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Thu, 26 Sep 2019 21:16:31 GMT
Content-Type
text/html; charset=utf-8
Transfer-Encoding
chunked
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Content-Type-Options
nosniff
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Pragma
no-cache
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Vary
Accept-Encoding
Content-Encoding
gzip
Set-Cookie
_session_id=c3c6e55ce4c9142c17d4a0156142a424; path=/; HttpOnly
X-Request-Id
f4ce2916-1576-464c-b2a1-c92308adbd04
X-Runtime
0.011175
adex.js
dmp.theadex.com/d/506/3014/s/
36 KB
13 KB
Script
General
Full URL
https://dmp.theadex.com/d/506/3014/s/adex.js
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.106 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
gzip
last-modified
Tue, 11 Jun 2019 18:16:05 GMT
server
nginx
etag
W/"5cffefe5-90b2"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 26 Sep 2019 21:21:31 GMT
/
track2.selfcampaign.com/tag/
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/tag/?request_id=69a09a55-9737-4345-90f6-34f8152875af&_auid=7ca7fab338920cc37f2b2371913d9c27&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
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
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27
  • https://track.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
  • https://track2.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
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
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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, 26 Sep 2019 21:16:32 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Location
https://track2.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx/1.6.2
Connection
keep-alive
Content-Length
160
Content-Type
text/html
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=1173
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173
  • https://track2.selfcampaign.com/map_td/?tdid=4748142316282753057&source=adform
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=4748142316282753057&source=adform
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
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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, 26 Sep 2019 21:16:31 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Thu, 26 Sep 2019 21:16:31 GMT
server
nginx
status
302
location
https://track2.selfcampaign.com/map_td/?tdid=4748142316282753057&source=adform
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-length
0
expires
-1
mark
lib.selfcampaign.com/tag/146005/
0
0
Image
General
Full URL
https://lib.selfcampaign.com/tag/146005/mark?t=1569532591
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
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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

global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 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.216.239.181 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
Last-Modified
Thu, 26 Sep 2019 16:53:05 GMT
Server
AmazonS3
x-amz-request-id
4B3B8631820367D7
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
drFg16uPJuxXyzEyn5M3B8KZ/lekWgeupfPOyfN9x61Ulc+IyoD+iCK0OQ+p0ExvhTkvdnGhOW8=
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

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
77.247.84.129 , 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
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:31 GMT
config.js
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
44 KB
10 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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
31427d08f3464606a700e198efd866ad4aa5198172208fe5450340bace6febe1

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Age
2209
X-Cache
HIT
Connection
keep-alive
Content-Length
9690
x-amz-id-2
bvBF3de0XAQyrkJWC+o9w8GSlc7IMTSKFp+CIAeqnEKn2iwFjGWE4OoUQ7MlV6yhWyQiGK+NgzU=
X-Served-By
cache-fra19176-FRA
Last-Modified
Thu, 26 Sep 2019 20:12:29 GMT
Server
AmazonS3
X-Timer
S1569532592.794256,VS0,VE0
ETag
"d749d046b1c996ccaa31846392177769"
x-amz-request-id
708FF66E79518D30
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
76
ads
googleads.g.doubleclick.net/pagead/ Frame 7BD5
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1569532591&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&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=1569532591421&bpp=3&bdt=708&fdt=235&idt=235&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&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=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.6lpqvdr548gs&fsb=1&dtd=240
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=1569532591&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&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=1569532591421&bpp=3&bdt=708&fdt=235&idt=235&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&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=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.6lpqvdr548gs&fsb=1&dtd=240
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:31 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 26-Sep-2019 21:31:31 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"
expires
Thu, 26 Sep 2019 21:16:31 GMT
cache-control
private
Cookie set /
d.agkn.com/iframe/8613/ Frame 39B7
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=108260985&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&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
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.121.36.175 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-121-36-175.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Thu, 26 Sep 2019 21:16:31 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%3AGSiCDHZZHkiBcxWIxWLSYAvWGWd7SrFy;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlH-cvJR_nLwAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
ads
googleads.g.doubleclick.net/pagead/ Frame D0D6
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591425&bpp=3&bdt=712&fdt=263&idt=263&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5169&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=2&uci=2.nodi8o8zkvvm&fsb=1&xpc=lUXEfagimf&p=https%3A//www.golem.de&dtd=266
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591425&bpp=3&bdt=712&fdt=263&idt=263&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5169&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=2&uci=2.nodi8o8zkvvm&fsb=1&xpc=lUXEfagimf&p=https%3A//www.golem.de&dtd=266
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:31 GMT
server
cafe
content-length
20609
x-xss-protection
0
set-cookie
IDE=AHWqTUmtmlxnyZS17lg4z-9zxph7_jWefwpHiAQANNc3_wauU9A5M63ktKlNzvoy; expires=Tue, 20-Oct-2020 21:16:31 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
expires
Thu, 26 Sep 2019 21:16:31 GMT
cache-control
private
ads
googleads.g.doubleclick.net/pagead/ Frame 6E3C
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591428&bpp=3&bdt=715&fdt=279&idt=279&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0%2C520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5878&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=3&uci=3.ra3xeqszu7b7&fsb=1&xpc=ApZdD7lgoy&p=https%3A//www.golem.de&dtd=282
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591428&bpp=3&bdt=715&fdt=279&idt=279&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0%2C520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5878&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=3&uci=3.ra3xeqszu7b7&fsb=1&xpc=ApZdD7lgoy&p=https%3A//www.golem.de&dtd=282
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:31 GMT
server
cafe
content-length
20359
x-xss-protection
0
set-cookie
IDE=AHWqTUnA5ip57kifb47xYQK0e5625Fiv1AKbD8VrImmI2cfPTXC5RBNhs8hhUAzu; expires=Tue, 20-Oct-2020 21:16:31 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
expires
Thu, 26 Sep 2019 21:16:31 GMT
cache-control
private
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
1002 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

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:15:52 GMT
Via
1.1 1f5757b46371746e677236d4fc67d364.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
40
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
X-Amz-Cf-Pop
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
ccUfIbhXYOyKqV6nJvc5uuR7c1pkUtsrc9csnfxxU2EJ_-1rRzHpsw==
Expires
0
/
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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1569532591735
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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, 26 Sep 2019 21:16:31 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=26&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=fd9b28418.a547e73c6_1569532591732&1569532591736
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=fd9b28418.a547e73c6_1569532591732&1569532591737
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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, 26 Sep 2019 21:16:31 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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1569532591738
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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, 26 Sep 2019 21:16:31 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
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
5 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=435981
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
5ff1ec1da0cd687f57271ea40875d07569d26a2c919d95310355a10cc464431e
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:31 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
989
cf-ray
51c8426b1a2dcba0-VIE
status
200
last-modified
Mon, 23 Sep 2019 16:25:34 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
Thu, 26 Sep 2019 22:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
Sun, 27 Oct 2019 21:16:31 GMT
sp_ojOH-220829_rc.jpg
www.golem.de/3473/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/3473/ad-time/sp_ojOH-220829_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 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_ojOH-804781_rc.jpg
www.golem.de/8203/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/8203/ad-time/sp_ojOH-804781_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:31 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
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&n3=1&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
a460dd47416578b87e25489620b5e1a9b247b83b9fc752c327c088d194038279

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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
1515
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201909241602/
25 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
994c75c7c155810e924895ddf706066b1dc59153d7e1697990ba915768c2d669

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 GMT
Content-Encoding
gzip
Age
716
X-Cache
HIT
Connection
keep-alive
Content-Length
9777
x-amz-id-2
VVBZnwaacEGmH5sUn6/NG+U6K9IZpdY6Pji+ko77du9JUY0/ZEH0u46e+wLtO3USoZyFsGPGIBg=
X-Served-By
cache-fra19176-FRA
Last-Modified
Wed, 25 Sep 2019 15:51:28 GMT
Server
AmazonS3
X-Timer
S1569532592.848789,VS0,VE0
ETag
"b3c76d127b9f61ef36f5b10abdbf07e9"
x-amz-request-id
E9DB25B5658DC138
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
864
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.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-44b"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Sun, 27 Oct 2019 21:16:31 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.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-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
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-39c"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Sun, 27 Oct 2019 21:16:31 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
263 KB
90 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:817::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
99ddca22fc298fbc23f9048c7b3b8d87edd49aaa20e3b32ab169f2e859838e5a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
91447
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 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
hd-main.js
hgc-cf-cache-1.svonm.com/
207 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=YTZwkQIcHI
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
c315a586a97014d06130743d536503023b825a4634dea6f8027e003221c8d75b

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:15:36 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
56
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 26 Sep 2019 15:07:54 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 1f5757b46371746e677236d4fc67d364.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA53-C1
X-Amz-Cf-Id
spxFWcYmCOpU_v1bb7Qa_FgGFH2HdV12WodskeORXcMlniSMHFM95g==
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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
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

Response headers

Date
Thu, 26 Sep 2019 21:16:31 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-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
Sun, 27 Oct 2019 21:16:31 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=db8a8c8e52a674ed14f1ecabf02a0091&userId=adscale-user:9664750850da4a7ea349481a66605ec3
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=db8a8c8e52a674ed14f1ecabf02a0091&userId=adscale-user:9664750850da4a7ea349481a66605ec3
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.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.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
Thu, 26 Sep 2019 21:16:35 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:35 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=db8a8c8e52a674ed14f1ecabf02a0091&userId=adscale-user:9664750850da4a7ea349481a66605ec3
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Thu, 26 Sep 2019 21:16:35 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=db8a8c8e52a674ed14f1ecabf02a0091
43 B
1006 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=db8a8c8e52a674ed14f1ecabf02a0091
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.83 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
250.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
Thu, 26 Sep 2019 21:16:34 GMT
X-Proxy-Origin
81.92.200.118; 81.92.200.118; 250.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.22:80
AN-X-Request-Uuid
246c15ce-dfef-4b9e-8213-bce57787f46d
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
Content-Type
image/gif
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=db8a8c8e52a674ed14f1ecabf02a0091
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
98
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=24qMjlKmdO0U8eyr8CoAkQ
  • 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.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
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
Thu, 26 Sep 2019 21:16:32 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

pragma
no-cache
date
Thu, 26 Sep 2019 21:16:32 GMT
server
HTTP server (unknown)
status
302
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"
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
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-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=db8a8c8e52a674ed14f1ecabf02a0091
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=db8a8c8e52a674ed14f1ecabf02a0091
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
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Wed, 25 Sep 2019 21:16:32 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=db8a8c8e52a674ed14f1ecabf02a0091
Date
Thu, 26 Sep 2019 21:16:31 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
99
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
bridge3.335.0_de.html
imasdk.googleapis.com/js/core/ Frame 7A9B
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.335.0_de.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::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.335.0_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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
194529
date
Thu, 26 Sep 2019 13:57:57 GMT
expires
Fri, 25 Sep 2020 13:57:57 GMT
last-modified
Tue, 24 Sep 2019 19:35:34 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
26314
alt-svc
quic=":443"; ma=2592000; v="46,43",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:81f::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

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:31 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"
content-length
10523
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:31 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=fd9b28418.a547e73c6_1569532591732&1569532592063
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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, 26 Sep 2019 21:16:32 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
truncated
/
207 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c315a586a97014d06130743d536503023b825a4634dea6f8027e003221c8d75b

Request headers

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

Response headers

Content-Type
text/javascript
view
securepubads.g.doubleclick.net/pcs/ Frame 5833
0
138 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxi3lbFR_-jY7nybklOmt0OcRElamtYraReZpvrHo1csYvdc3PhnWrZR9LjFpeeYZIjcQm1T9_imqxYNNnDPgF2vFQFNpfvIAPL5TtpndQ6RlsJOiM2ebBAYDIuCZu5wGClSVwHVe6u1QtiDqqAROdNZlenRAF-AliAc2R1TJrQxtOc4sTIKA9Ad5hE-4UtOaZ7M6qI3vc8j1yNCwZHro-YJ8zp72okZagIpoF40TZzEu9vZwb-IM9PesbkpTcFJ0tsYIh4g64gkbeu4Vx5JUREiO1&sai=AMfl-YTQSpySCEFQWxVXmIe75deMMf5lQxVPYz48ox06BUcQPuwBREuVdRkSChLJbD50Lr81DSqhCUBrqIVVOCz5xDQBTcNYMnQP5efT4HFE&sig=Cg0ArKJSzIOtCGRezJODEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 5833
44 KB
14 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 497 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 5833
78 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29692
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 4105
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvPbTpSYCe01AMYES9dw5RNTIftr5Dj8r9R66WmlHHOFja-qQpcP1sj38SdSqIZcb5xamm04dOrvML_caFXG4QFoYlyusNzBFYzSDlJmxYOsKj6V4XlqkgzBk25qvD6mcHYVYNJW1z4EpbOtDpKb4L9hdZhXZgB0IPxHSVpIqXCf_xSiq9ReLY_PExK108L7ylkrbhymJd5NXmTSyOCWrnKXz-Ka0DwnYGEceAf6IDCsfDDFr1QgZyEZREm6-jyWEinpbQzW3CsQcRvybftJU1SMmRn&sai=AMfl-YTNIm-e4d6P_6cPRWNkvhUGEH0heUkXy_SdXW7bQOwFydU-TIP6RgHz55XgS88LCyz9A_w28MvI0jGmRzjkx1LBCWCyp7UGTQ6yVpgS&sig=Cg0ArKJSzJjVcpuPBLtGEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 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-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 4105
44 KB
14 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 556 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 4105
78 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29692
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 98A0
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsubzw7bPZtppTDv6f7-dC7QHcRugA4ehigNJ5E-uvy0Jr9mHwm3m9JCrh7Pr05N78v1upMNnljg4XZ7n9Ws6Kgs66B77E-iucL-SAnCixqt6QxPRIVTtjIaoO8rObo6P6XIyc2K37rHhJNIgzQRwJXHhF1d0NHxOKts_rTZU_OpJ69McG1gLqrJbximpSgQu4I2QkCruk7C07WUi-EGDhQCl7oZeYgEJkDQmZ-Tg-RxUYpT-qWKAaTmCdZq98D63PycWYET_6oDMHMTA1oGDkBrhOJS&sai=AMfl-YQTJPI-74h3RV4nzgXbAObd8gyhE7UZdteirXcJgZer-7wYBaor4aq9c2W5_8ArYm0rVwJRICi2iGKeufca5Sd0gPiJH8pQDVsk0jjq&sig=Cg0ArKJSzB_T7rCKiNf4EAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 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-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 98A0
44 KB
14 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 612 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 98A0
78 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29692
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 1F15
0
129 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxoCfrbUhmxALsuRFNaqfm9GKdGoMfhBW0C9qudo5wtVGmQA1tkgS1v1q0FPDz998P5xqgZiAtkQPX381AW5JHxbcTnHMj1kywqNDUkHMyTffwd3OsybO7isNcEq4sW-TaE2OPEQiJbsOO1BIFUVkflVXBiePKtXl3aU7lM8OZRS8fJfTq9F6hmW-vinCRWz9rkb68gYscSSJzrAn5pk-iBN3VF-PiieRww1s1GzCgCDO166XYIGTLs-MhbHW_Fo1vKdvTDRGk12u7OkZryTu5MRz3&sai=AMfl-YR1X_58WKWXA4AxNNQ21mqZztcpMxlO-v-EsdnGnO6A43D_DFgFj6Vs4JlVXVrIAiLLYpUYAcZSJD57aogn6bMIZsLA8E26w_h2KX3q&sig=Cg0ArKJSzOy4deedC9tEEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 1F15
44 KB
14 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 117 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1F15
78 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29692
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 0FD6
0
129 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuhQYlyHmpSPJvMdovq-OfgKjGPkYhUP5IxVu9OxlhifBV4oXiQXZyijbtvjIX5H9VKKwejU0KOat55O_uvYfVH700tygQOWuMN_Wh58j6qK_AKn7vaNt3XNQe9be22JG-TBKtvy9ZUS10jn2OsndPaMt4IJyleY5m_INOFlYJXI0ZrreGvsOymOrN2oDRjZyiCk7WSvw94MfVVXv2W3JDRCVGeAmQqvmYpihkoEBet0OC8A4jr2tfY1UF6SYU5-KMm9UPW1C5Jq7D3hbc1OYILizqZ&sai=AMfl-YTY-5FlLcvU-gde3MK8ceYe_P9VlJ4DF5rRFSSFPcM-mP7MmzLEDvuVJ3v1CIfr3-gAFTNLZRxfX7YPDbvN-5NCkMMiHVpimBSoOSLq&sig=Cg0ArKJSzKgFAYSPk0CqEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 0FD6
44 KB
14 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"291 / 921 of 1000 / last-modified: 1569527018"
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14246
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0FD6
78 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29692
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
pubads_impl_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 5833
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
integrator.sync.js
adservice.google.co.uk/adsid/ Frame 5833
113 B
598 B
Script
General
Full URL
https://adservice.google.co.uk/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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 4105
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
integrator.sync.js
adservice.google.co.uk/adsid/ Frame 4105
113 B
175 B
Script
General
Full URL
https://adservice.google.co.uk/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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 98A0
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
integrator.sync.js
adservice.google.co.uk/adsid/ Frame 98A0
113 B
175 B
Script
General
Full URL
https://adservice.google.co.uk/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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 1F15
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
integrator.sync.js
adservice.google.co.uk/adsid/ Frame 1F15
113 B
175 B
Script
General
Full URL
https://adservice.google.co.uk/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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 0FD6
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
integrator.sync.js
adservice.google.co.uk/adsid/ Frame 0FD6
113 B
175 B
Script
General
Full URL
https://adservice.google.co.uk/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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
ads
securepubads.g.doubleclick.net/gampad/ Frame 5833
21 KB
9 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=977680051757335&correlator=2549258621441485&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062421&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x600_1_dc&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=adslot%3Dsky%26src%3Dsdg%26yieldlove_pid%3D17298%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522sky%2522%255D%252C%2522af%2522%253A%255B%2522f1x4%2522%252C%2522f1x3%2522%252C%2522f1x2%2522%252C%2522ds%2522%252C%2522sky%2522%252C%2522hpad%2522%252C%2522band%2522%255D%252C%2522as%2522%253A%255B%2522sky%2522%255D%252C%2522hb_unit%2522%253A%255B%2522sky%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522rfree%2522%253A%255B%2522200-299%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17298.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217298%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17298.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17298.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592406&dlt=1569532592216&idt=182&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=2&adx=1303&ady=10&adk=1672853988&uci=ienorn119qws&ifi=1&ifk=2036525376&u_tz=120&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=300x40&msz=300x40&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=2130446015&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
8cda6ce4297fa9afd2c18bc5b6c82b6e9a9ecb14aa789b4463613f9f3e83ea49
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
br
x-content-type-options
nosniff
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
9239
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 5833
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 5833
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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 5833
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7e110d22c8de6c0a2f30a0c892cf578b96e8b4e50d55f3d2fcb46fcb46db01fa

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 4105
21 KB
9 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3217741005400948&correlator=1989870544897538&output=ldjh&impl=fif&eid=21064124%2C21063635%2C21063817%2C21064507%2C21064520%2C21064592%2C21064678&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_970x250_1_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31&scp=adslot%3Dbanner%26src%3Dsdg%26yieldlove_pid%3D17295%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522banner%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522wp%2522%252C%2522firepl%2522%252C%2522bb%2522%252C%2522vidwa%2522%252C%2522brabo%2522%252C%2522fufrad%2522%252C%2522floor%2522%252C%2522videoTakeover%2522%255D%252C%2522as%2522%253A%255B%2522banner%2522%255D%252C%2522hb_unit%2522%253A%255B%2522banner%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17295.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217295%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17295.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17295.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592428&dlt=1569532592223&idt=199&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=250&oid=3&adx=308&ady=140&adk=396647303&uci=ei30kvax3xb7&ifi=1&ifk=1044686037&u_tz=120&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=2122968672&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
63e58a3ac724005ee3e939d07cec69a4baf2306eca48c9fb9ae5649889d653d7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
br
x-content-type-options
nosniff
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
8993
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 4105
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 4105
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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 4105
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
85d3b6aaf53003bbf32e8836d5bc91173c21e76412b5139634336fce552debea

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 98A0
21 KB
9 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3801454602102002&correlator=3089965105031568&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062420%2C21062832%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125&scp=adslot%3Drectangle%26src%3Dsdg%26yieldlove_pid%3D17299%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle%2522%255D%252C%2522af%2522%253A%255B%2522f1x2%2522%252C%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17299.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217299%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17299.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17299.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592453&dlt=1569532592229&idt=217&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adx=993&ady=1028&adk=1812355494&uci=22dgu1dlcsoc&ifi=1&ifk=4049690229&u_tz=120&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=300x20&msz=300x20&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=1006680154&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
65e86350610343890e1766ad71056f8dbe4b353279ee39fc1adfb49d3d1e38e3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
br
x-content-type-options
nosniff
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
9144
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 98A0
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 98A0
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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

global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=1080057771
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.239.181 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:33 GMT
Last-Modified
Thu, 26 Sep 2019 16:53:05 GMT
Server
AmazonS3
x-amz-request-id
8F1F4FC5D14D23BB
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
MYXEdf7wTKZjS1X7aTQgjMACTNzGbApM9PdqJiVi+SV9NpkMF+S3boCGpY/5RfctvyZKVeXakFw=
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=8282157263
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
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

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 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
truncated
/ Frame 98A0
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8fa36bd11907c3ef579218c4df5362ffee40160a3b9517588091d184dbc84542

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 1F15
302 B
205 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=513223060941822&correlator=3905587765812749&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=20x10%7C20x15%7C30x10%7C30x15%7C40x10%7C40x15%7C80x10%7C80x15%7C100x10%7C100x13%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%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A18494.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592490&dlt=1569532592237&idt=247&ea=0&frm=23&biw=1585&bih=1185&isw=770&ish=251&oid=3&adx=408&ady=1643&adk=2366093405&uci=89wf7ctaefcw&ifi=1&ifk=1036748905&u_tz=120&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=770x10&msz=770x10&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=1214184772&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
5303e348372628d65a4165215231175c440dc401c1ec826dcee74168436a3dc5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
128
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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 1F15
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 1F15
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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

ads
securepubads.g.doubleclick.net/gampad/ Frame 0FD6
300 B
202 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=126867689492655&correlator=782557617482829&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C10x11%7C301x250%7C300x126&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%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17300.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592503&dlt=1569532592242&idt=255&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adx=993&ady=4510&adk=4292326851&uci=ud9er596z8dy&ifi=1&ifk=4200391111&u_tz=120&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=1000541211.1569532592&ga_sid=1569532593&ga_hid=27540368&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
b7ca2ee955e7631732abb3e869c7a8d409ea414194bb22f7b6da2b5a6700beff
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
125
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_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame 0FD6
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 0FD6
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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

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=1145424042
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
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

Sec-Fetch-Mode
cors
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
Thu, 26 Sep 2019 21:16:32 GMT
Via
1.1 1f5757b46371746e677236d4fc67d364.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
nAPVs6UZ-sWJjbNJfKAY1lRIcpKIyIWDxLgbzH57YwyFbdKG15kThw==
Expires
0
truncated
/ Frame 1F15
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7cbd5c99d438adf5abbb0f897556f08c0d7bae7b4fe2a31669d4b48d0cc67b08

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
/ Frame 0FD6
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9a1a0efffe8ee8b3f71057bab274fefdd302b8278fc6db961a51e5abd11c84d0

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
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZDDRAAKktFLkqFFlqwF23A52AwwA/k0FVEmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzBELlnFBUkzFYBP5QAAAAAAABNJWAPCAAFAANJWTYeNAPAAAXUAKAABYeNAZCAAOA55A55A85B55A58E55A55AFA5wA3wAxBErYeNASksFqFjAAAAAAAAAAAAEAAANJWAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA23A43Ay2Az4ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A23A24A3xADAzrF5BFKA04A45A23A24A3xAKA04A45A23A24A3xAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAYeNAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFN/3NUA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZEPRAA/k0FvImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AyBELlnFCUkzFYBPFAAAAAAAAB2I8APAAAFAA2I8Tl5/APBAA0EAMCABl5/AZBAAOA55A55A85B55A58E55A55AGAy0A2zAy2Arl5/ASksFwFjAAAAAAAAAAAAEAAA2I8AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA23A13A4wA0wANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A35A34A52AGAihFuuFlyFKA04A45A35A34A52AKA04A45A35A34A52A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFd0EAMCAKPA6DAFAAAl5/AAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFn5/YWA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZFPRAA/k0FQNmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10ALlnFDTkzFPPKAAAAAAAAB7i2ASksFCFjAAAAAAAAAAAAEAAA7i2AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAxBEMAxzA4yA23A43Ay2A12ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A24Aw3A00AJAylFj0FhuFnsFlBFKA04A45A24Aw3A00AKA04A45A24Aw3A00A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFQtjF9sTzYA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
/
ssl.3.damoh.golem.de/29aef076687345c9c37ca367b8a5451aad4b1991/
311 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.golem.de/29aef076687345c9c37ca367b8a5451aad4b1991/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.49.53 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.53.49.4.46.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

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

Response headers

Date
Thu, 26 Sep 2019 21:16:32 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
de6-homad-3
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
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZGjRAAUkzFJBPAAAFAA7i2TbosAPBAAhPAEQABbosAZBAAOA55A55A85B55A58E55A55AGAyyAz0Ax5ArbosARksF6dhPAEQAsEAZJAFAAAbosAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFL7eQSA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZHkRAA/k0FyRmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A31ATkzFARksFAQtjFzaAzZA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZIwRAALlnFEUkzFYBPTAAAAAAAABAD9APAAAFAAAD9TTfPAPAAAYGArZABTfPAZCAAOA55A55A85B55A58E55A55AGAy1AwwA04ArTfPASksF8FjAAAAAAAAAAAAEAAAAD9AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA2zA1yA50A5yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AKAipFssFivFhyFkyBKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdYGArZACMA7DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFf9/ySA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZJwRAA/k0FaWmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A31AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A43ATkzFARksFAQtjFKy+MeA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:32 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:31 GMT
gen_204
pagead2.googlesyndication.com/pagead/ Frame 0FD6
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=10x10%7C10x11%7C301x250%7C300x126&w=300&h=250
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::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 83D4
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-35/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Thu, 26 Sep 2019 11:47:29 GMT
expires
Fri, 25 Sep 2020 11:47:29 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
34143
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 5833
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29169
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.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

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

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-35/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Thu, 26 Sep 2019 11:47:29 GMT
expires
Fri, 25 Sep 2020 11:47:29 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
34143
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 98A0
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29169
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.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

status
200
date
Thu, 26 Sep 2019 21:29:07 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
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,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.90.4 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.4.90.243.136.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:36 GMT
Last-Modified
Wed, 29 May 2019 10:51:09 GMT
Server
openresty/1.15.8.2
ETag
"5cee641d-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 ACDC
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
1c25473ef26ba82a8146bcda4aab96ee2b0cb76005d5b7f69d2be1c430a616a8

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

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-35/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Thu, 26 Sep 2019 11:47:29 GMT
expires
Fri, 25 Sep 2020 11:47:29 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
34143
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 4105
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:32 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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-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
29169
x-xss-protection
0
expires
Thu, 26 Sep 2019 21:16:32 GMT
gen_204
pagead2.googlesyndication.com/pagead/ Frame 4105
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31&w=970&h=250
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::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:32 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.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

status
200
date
Thu, 26 Sep 2019 21:29:07 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
activeview
pagead2.googlesyndication.com/pcs/ Frame 5833
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssqHC8IiKjMQ1_Sd1m2q3qGYY-fNu65nXfkGAwARNKWN5mHm-oSTVwsXoD1Ur-TEC3sLWiS9sUVBlwKanf_dNVfkFNJg-KiS8uTjtWz2wA&sig=Cg0ArKJSzPp0yfKKTFJIEAE&adk=3744015188&tt=-1&bs=1585%2C1185&mtos=0,1038,1038,1038,1038&tos=0,1038,0,0,0&p=10,1303,610,1603&mcvt=1038&rs=3&ht=0&tfs=752&tls=1790&mc=0.94&lte=0.94&bas=0&bac=0&met=no&avms=nio&niot_obs=465&niot_cbk=503&md=2&lm=2&rst=1569532592219&rpt=214&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-22-18-14-166-16-0-0-0&tvt=1785&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
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::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:33 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 4105
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuV65mn_49gZwkDCh1_l7skG4ksxZ80rla759phQOZ_ebCFJZHefIgektyf5_GCsmDNuPWKosGlrE-ise4kfdHUwS4IUysELoMSPbgPMkI&sig=Cg0ArKJSzCACdJIl-5z9EAE&adk=2546325955&tt=-1&bs=1585%2C1185&mtos=1038,1038,1038,1038,1038&tos=1038,0,0,0,0&p=140,308,390,1278&mcvt=1038&rs=3&ht=0&tfs=752&tls=1790&mc=1&lte=1&bas=0&bac=0&met=no&la=1&avms=nio&niot_obs=471&niot_cbk=503&md=2&lm=2&rst=1569532592225&rpt=233&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-22-18-14-166-16-0-0-0&tvt=1785&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
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::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:33 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 98A0
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssJKN3q1_tOp7dM_r-rZXkjYHxKXASU5Eqax1ec4FM5rbG7b8DrvpPgkNBFyYdZfoQvgpKkM2PsyYK1n8h1FcumeBP-oxWWyqttKCTKY48&sig=Cg0ArKJSzPHdI-gPHPNmEAE&adk=1693156142&tt=-1&bs=1585%2C1185&mtos=0,0,1047,1047,1361&tos=0,0,1047,0,314&p=1028,993,1278,1293&mcvt=1047&rs=3&ht=0&tfs=856&tls=2217&mc=0.62&lte=0.26&bas=0&bac=0&met=no&avms=nio&niot_obs=477&niot_cbk=503&md=2&lm=2&rst=1569532592231&rpt=281&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-36-22-14-202-20-0-0-0&tvt=2211&r=v&id=osdim&vs=4&za&uc=15&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
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::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:33 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 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.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:35 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
usync.html
eus.rubiconproject.com/ Frame FB0F
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.55.184 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-55-184.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
rsid=1|AIfsdBUO++vuGxiryvYpOSLpoZhhcvfF0nA7IpLwOQ91wd/TOnrmEIzya9WQiOHKKRWt2j6qYTD2eRvLWSDhFgX3ng06hUEE9RUpasHbexklvGigDaQxIKvjSKjZNDCUbu3N1n9hUy4=; ses57=; vis57=241806^1; ses15=; vis15=241806^1; vis10=241806^1; khaos=K1176IEH-1A-9RCJ; ses10=241806^1; audit=1|hLZGFuTafB2ZNYbhSIdN2yyyR4J2HJh84byddQcHNKclJoektzfJ/m69RYya3iefKDvzDhQHTbZD+EbPh3UKYNzpQ7vzkXQ/
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Wed, 25 Sep 2019 17:59:19 GMT
Content-Encoding
gzip
Content-Length
7695
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=66169
Expires
Fri, 27 Sep 2019 15:39:24 GMT
Date
Thu, 26 Sep 2019 21:16:35 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 42ED
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
icu=ChgIt6FYEAoYASABKAEwsdW07AU4AUABSAEQsdW07AUYAA..; uuid2=4339593655014582991; anj=dTM7k!M4.FE:2jUF']wIg2IlajbWtj!]tbPl1N!7Qhn_4=0KZ)/41Yk/4^3piIPEp5=!tkgvQ#<3j*Ed1./nKiWSC$jPgbE/tCa$.wL4W1Qw3*[^d%(
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:35 GMT
Age
4448080
Connection
keep-alive
X-Served-By
cache-jfk8124-JFK, cache-fra19151-FRA
X-Cache
HIT, HIT
X-Cache-Hits
1, 187705
X-Timer
S1569532596.744789,VS0,VE0
Vary
Accept-Encoding
index.html
cdn.districtm.io/ids/ Frame 11EC
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
__cfduid=d9a7d8c4149b104754f225441f376f4ca1569532591
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
date
Thu, 26 Sep 2019 21:16:35 GMT
content-type
text/html
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
cache-control
s-maxage=1209600, max-age=14400
strict-transport-security
max-age=31536000; includeSubDomains; preload
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
51c842815eec35d0-LHR
content-encoding
br
pd
eu-u.openx.net/w/1.0/ Frame 401E
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?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.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=53d78010-f5c9-0704-19c4-b9937065faad|1569532591
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept
set-cookie
i=53d78010-f5c9-0704-19c4-b9937065faad|1569532591; Version=1; Expires=Fri, 25-Sep-2020 21:16:35 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1569532595|mOgikimWiygu; Version=1; Expires=Fri, 11-Oct-2019 21:16:35 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Thu, 26 Sep 2019 21:16:35 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear
/
ssl.3.damoh.golem.de/d374a36aafa243c04839fb55c0ef890dad48023b/
110 B
670 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/d374a36aafa243c04839fb55c0ef890dad48023b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.49.53 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.53.49.4.46.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

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

Response headers

Date
Thu, 26 Sep 2019 21:16:36 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
/
ssl.3.damoh.golem.de/f94c2c9484ddd54f6d6b6dd3781b8e78b3ffa0ba/
111 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/f94c2c9484ddd54f6d6b6dd3781b8e78b3ffa0ba/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.49.53 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.53.49.4.46.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5

Request headers

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

Response headers

Date
Thu, 26 Sep 2019 21:16:36 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
111
/
ssl.3.damoh.golem.de/c0cd335bfce67ff105c1f1ec2d0be0ee83a44eed/
110 B
670 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/c0cd335bfce67ff105c1f1ec2d0be0ee83a44eed/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.49.53 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.53.49.4.46.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

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

Response headers

Date
Thu, 26 Sep 2019 21:16:36 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
data
lb80.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb80.s400.meetrics.net/data?/wTLZKJOBALlnFFUkzFyCPLAAAAAAAABZLaAPAAAFAAZLaTCDTAPAAAhPAcGBBCDTAZBAAOA55A55A85B55A58E55A55AGAxwA3yAy1ArCDTAPBCAXUAKAAHYeNAPAAAYGArZAITfPAPAAAhPAcGBICDTAPAAAhPAEQAHbosAPBAA0EAMCAHl5/APTqAsEA6DAMbosASksFFGjAAAAAAAAAAAAEAAAZLaAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPAcGBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFKqADTA
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
176.9.42.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h227.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
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, 26 Sep 2019 21:16:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 26-Sep-19 21:16:35 GMT
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
dkfVZvfV0gdhc2R5a4arQG6Eo23V0d6t
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:38 GMT
Server
AmazonS3
x-amz-request-id
45280296D20EB550
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Thu, 26 Sep 2019 21:16:40 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tKq7230iBP/75HIazwSTtIgKBAKWav7f2wNpExvvRpJpHdOMd1onSwcOTNUFAJE7ai1oRBjulIY=
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=93530475
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.106 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:40 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:01 GMT
server
nginx
etag
W/"5d1f5601-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 26 Sep 2019 21:21:40 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
Thu, 26 Sep 2019 21:16:40 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:13 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Thu, 03 Oct 2019 12:18:06 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.18.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-18-165.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:40 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
495 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=11696415&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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, 26 Sep 2019 21:16:40 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 2187
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=dbdfdd4e12e94698aa56049e2fe898d8
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
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
Thu, 26 Sep 2019 21:16:40 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:40 GMT
Content-Length
628
Connection
keep-alive
Set-Cookie
tu=4#236708395#48~~435981~435981~1#101~~435981~435981~1#38~~435981~435981~1#72~~435981~435981~1#42~~435981~435981~1#75~~435981~435981~1#60~~435981~435981~1#63~~435981~435981~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

Server
Apache-Coyote/1.1
Location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
Content-Length
0
Expires
Thu, 26 Sep 2019 21:16:40 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Thu, 26 Sep 2019 21:16:40 GMT
Connection
keep-alive
Set-Cookie
uu=dbdfdd4e12e94698aa56049e2fe898d8; Domain=.adscale.de; Expires=Wed, 23-Sep-2020 13:43:20 GMT; Path=/
launcher.js
sak.userreport.com/sdm/
58 KB
18 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: si.nuggad.net
URL: https://si.nuggad.net/rc?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.51 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-51.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad

Request headers

Sec-Fetch-Mode
no-cors
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
cj2VE0YVfLxhuffg0VJh8ccads9KhSqM
content-encoding
gzip
last-modified
Thu, 26 Sep 2019 14:50:20 GMT
server
AmazonS3
age
46
date
Thu, 26 Sep 2019 21:15:55 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
nBc5VeMVbZHqcllfsWhPzQnicNH4CE3swcu9ReHMmayZvIVmKMp6kQ==
via
1.1 a75b67932d84d80b40e12159613deb17.cloudfront.net (CloudFront)
nid
ap-sync.nuggad.net/
0
297 B
Image
General
Full URL
https://ap-sync.nuggad.net/nid?nid=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:4a00:12:6213:9cc0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 14:02:53 GMT
via
1.1 9be2d2d7560f88bdc5d5a3a94863566a.cloudfront.net (CloudFront)
server
nginx/1.14.1
age
26027
x-cache
Hit from cloudfront
status
204
cache-control
s-maxage=86400, max-age=0
x-amz-cf-pop
FRA56
x-amz-cf-id
jPsqj23CkGEDBTmpOwWzsQbLfXhO1IkWr9WZ6qqELX3azarrGGaQpg==
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
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:40 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:20bb:da00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
Wed, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
121950
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
FRA56
content-type
application/javascript; charset=utf-8
x-amz-cf-id
7txy2mcFZ4XWUJhTsZX4r1hg3YEgdyidYnmhMG-oKq3Sea-_Ee24zA==
via
1.1 e430a35037c484cf19f375480cabfca3.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=-2&screen=1200x1600&mbr=db8a8c8e52a674ed14f1ecabf02a0091&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=831448833278
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.18.18.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-18-165.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
d682a58ae6689a2160e6b33f0de1f3df473f208dfc4ce218fdc283ae1a929688

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:40 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.35.6 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-35-6.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.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
Tue, 24 Sep 2019 16:55:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 24 Sep 2019 16:54:35 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame 0650
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESasBDwABiw3BsUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205021767115897261
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4205021767115897261
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.18.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-18-165.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
Thu, 26 Sep 2019 21:16:40 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Thu, 26 Sep 2019 21:16:40 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4205021767115897261
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame 19A1
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.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.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Thu, 26 Sep 2019 21:16:40 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=db8a8c8e52a674ed14f1ecabf02a0091
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.18.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-18-165.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
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
Thu, 26 Sep 2019 21:16:41 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
/
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&1569532601754
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
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
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, 26 Sep 2019 21:16:41 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

Verdicts & Comments Add Verdict or Comment

170 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 function| $ function| jQuery object| iAbo function| golemAcceptCookies boolean| deliveringAds boolean| subDomainCheckVar function| JJMQUdd object| hnrpx0baFlags string| hnrpxcd3Rnd object| hnrpxde21tc string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag boolean| hnrpx7d0sdl boolean| hnrpx7d0sdln string| hnrpxde21genat string| hnrpxde21sthash boolean| hnrpx881forceimp object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| adsbygoogle object| google_tag_manager object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| stroeerCore boolean| hnrpx15aBody boolean| hnrpxe49Detect object| hnrpx6ccMobile object| hnrpxde211 object| hnrpxde21o1 object| hnrpxde21o2 object| hnrpxde21o3 object| hnrpxde212 number| hnrpxde21d3 object| hnrpxde214 object| hnrpxde215 boolean| hnrpxbe4ij object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad number| _gfp_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars string| GoogleAnalyticsObject function| ga object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq function| Swiper object| google_tag_data object| gaplugins object| gaGlobal object| gaData 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 function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired boolean| google_noFetch object| ScTag146005 object| ScTagAdditional146005 object| axd2 object| s object| _adexc object| rmp3pi function| SwfVideo object| exportz object| m object| confiant function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet function| Goog_AdSense_OsdAdapter object| __io function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock number| _m6rApiLoaded function| _h object| adex string| _io_uniques_holing_params object| _m6rOnce number| _m6rContainerLoaded 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_651048 object| closure_lm_310937 object| VochaivajoolaiTh boolean| D function| videopkgInterface boolean| hnrpxdc0Track string| hic_qos string| apsrc object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| audienceProjectLayer

1 Cookies

Domain/Path Name / Value
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImtkQzgiLCJ0c2wiOjE1Njk1MzI2MDAsIm52IjowLCJ1cHQiOjE1Njk1MzI1OTEsImx0IjoxNTY5NTMyNTkxfV0.

6 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://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust(Line 15)
Message:
getPageCorrelator undefined
console-api log URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1(Line 1)
Message:
No Cookie
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust(Line 15)
Message:
getPageCorrelator 874456382727881
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust(Line 15)
Message:
getPageCorrelator 874456382727881
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust(Line 15)
Message:
getPageCorrelator 874456382727881

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.

acdn.adnxs.com
ad.yieldlab.net
ads.golem.de
adservice.google.co.uk
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ap-sync.nuggad.net
api.theadex.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
c1.adform.net
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
delivery.selfcampaign.com
dmp.theadex.com
dmx.districtm.io
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
golem.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb80.s400.meetrics.net
lib.selfcampaign.com
match.adsrvr.org
pagead2.googlesyndication.com
prg.smartadserver.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
sak.userreport.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
ssl.3.damoh.golem.de
stats.g.doubleclick.net
tpc.googlesyndication.com
track.selfcampaign.com
track2.selfcampaign.com
tracking.m6r.eu
tracking.yieldlove-ad-serving.net
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
104.109.82.87
104.16.190.66
136.243.12.39
136.243.90.4
142.93.164.12
143.204.214.51
143.204.214.52
143.204.214.67
148.251.131.173
148.251.69.233
151.101.13.108
151.101.13.194
172.217.16.194
176.9.42.70
185.33.223.83
185.86.138.79
188.40.118.169
2.16.122.151
2.18.233.67
2.18.234.21
2.18.234.72
216.58.207.34
23.37.55.184
2600:9000:20bb:4a00:12:6213:9cc0:93a1
2600:9000:20bb:a200:15:efbc:e300:93a1
2600:9000:20bb:da00:1c:8c89:a300:93a1
2606:4700:20::681a:3cd
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:806::2002
2a00:1450:4001:809::2001
2a00:1450:4001:80b::2002
2a00:1450:4001:80b::200e
2a00:1450:4001:814::2008
2a00:1450:4001:815::2002
2a00:1450:4001:816::2002
2a00:1450:4001:817::200a
2a00:1450:4001:81f::2006
2a00:1450:400c:c00::9a
2a02:26f0:6c00:18a::5f76
3.121.36.175
34.248.95.73
34.95.120.147
35.186.238.175
37.157.4.40
46.4.49.53
52.18.18.165
52.216.239.181
52.28.163.57
54.154.35.6
62.168.44.118
63.32.23.112
69.173.144.141
77.247.84.129
77.247.84.149
80.82.201.88
85.114.144.106
89.163.159.106
89.163.159.110
91.215.100.39
91.215.103.65
022a16522ee47a29b02fac58a343eb73953f23a27949e98ae1991f220912a393
0329ae2d10162ba48206d0f090f9e60ef881baf24b7723d4df74cbb368bede9c
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
05cc76cf8ecc468b9960df4a8a354a44784d440277c8223994fe29dd2e1ebcc7
06add06f48aca05d5f8c36f1a3caf176a423d1fe8f2635bab701ca6c4879ef3d
0a2ea8c3c7a4eb2dafba322201da75ae16775eb5568939e0845f41be420f9dd5
0b514fb40e458e04357ffd31004c6e84b6b06eb75aa9f4fccdfacd5b0d5b3092
0cf30fef0fab894e55602dccf3099fa7c19b13a6f97e84d4d498a532b5a6c725
0d226045d76e8f0e97363ffee3ef7baf7da4ffd968eb0b496a3e82e048eff601
0fa07fa6da07ff6ea5a1baeb49b611819f51ab55c7e2e7dfbff8113bd7466588
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
13acf701f508a52f8bdd15ee734de2f70e652369ff4c117e4709ec8e4235a9fb
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
168a22846aba37d45ba1c76c155db3ccc9ee0e544438182876f8f860f72c043b
1a2d672618e60c667ce620319f392ae45207f2c77c60299ffb5290210b150c53
1c25473ef26ba82a8146bcda4aab96ee2b0cb76005d5b7f69d2be1c430a616a8
1e54578861eb9b537e524171eebda0b0e1fd4fcf7f05e0d7edfc4eb61c3b3590
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
25cfc5d790d9aca4249fa5b36317cd0679518d62372a32c426d5cd7e9c778e79
2896a1ed19d811cf074c327eb1b69c9c973df6849a23cb476969e8a745c76faf
298cdc0ceb83b57b46111f625115741bb82981b53f0d4894840e875ca08391b0
2fa4c073f1014a9bc165374be7ebc2a1cfce3dcfe33e2369830b64bd8524cbd6
31427d08f3464606a700e198efd866ad4aa5198172208fe5450340bace6febe1
317b2956ed1d4fbe5a078e6f2fa95e653b43d9458b7672a77b3ec116f08db4f7
32e6a5ef7661af8355c2d16b1b5704714e3285cd594c6692fc77f1136b2dba30
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
3561cf4c1aab3cef0a647d104655ab496ac13302127ef88e9e1d5faa451de455
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
37d6d96c37563f3f7820e4ff7f217ce15003dabb53a9283790adb0a0e152f171
39d7ac9761700bbcb36948782f8508d446832fcb48b71c04c0ff56ed10457639
3d0e20e960d26b6b610d648198b6b410c230d5f3e59fc32cb0464e69592deb5c
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
415259ebdbe30832ba0a86e5ec994a83938ce0e8361d12a7fce02c34384ea131
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4a16db7713ec94f2f9b11c587fa12f4c89c84097b10a542293c0da1d229e2371
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4d6578dd4fdcafe647cd6a7dd62ec29711ed5bc7bb7f0631c7f979f0b7e0696f
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
503ca57c58bc0eeb4f64839186626d02ca2617b119ec31e6342125888c1a28da
5303e348372628d65a4165215231175c440dc401c1ec826dcee74168436a3dc5
53fa685c240745b73907db2bdb60fb752bcefb7f6ec9141fd1a739a1997e82c1
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
56e1b70b247005fe0bbe144a844c21edf8342cca00393e61a7e493572ef54ac7
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5c351b8b801dc14d4fe2b97fbc29a71c4f9ea069718616f1abcdcee231dd74b2
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ff1ec1da0cd687f57271ea40875d07569d26a2c919d95310355a10cc464431e
6002360e1135016056737bf27c3c07441b6343369c58ea262652f66901c0831d
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
61b68cc4920e75493ba894cfbf37558ab9d6fdff42107532b869da59ea6abf5e
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a
62d19b29386236267f264d98258a648c4f402fdf4c67d12140cf354f9d926af2
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
63e58a3ac724005ee3e939d07cec69a4baf2306eca48c9fb9ae5649889d653d7
65e86350610343890e1766ad71056f8dbe4b353279ee39fc1adfb49d3d1e38e3
67e989044afb1b22e322e83aed6a373784d391e9613ee84f551441e81224be23
6b0fc1df9ae80ce09cfd696aa086c1228f09197c359fdc01f6e0129522acdc3a
6c0deeeb12982848ccc0ee06a8483790bfcfc070b91fcd6c50660aab76ca39d7
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad
6d44a82c974768ad9c36b4c00848316f95b6351fc52d1cc7304e157c0c151358
70444a9702dd4e5190f40322d8d8dabe753d3e9511304c4429081ee2071769d1
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698
748de7889eacf85fc014b76171e37d2544fbf9d7598e20d2c5d5394e7653b360
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
791d71816be1d825f725979243295c0745a24fc07fd75a859a71cc06fc73ca71
7cbd5c99d438adf5abbb0f897556f08c0d7bae7b4fe2a31669d4b48d0cc67b08
7e110d22c8de6c0a2f30a0c892cf578b96e8b4e50d55f3d2fcb46fcb46db01fa
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
84b21737e9bdf0817af9da35e76e2cdcba563c4f3dbfdab97f3d47f04501d881
85d3b6aaf53003bbf32e8836d5bc91173c21e76412b5139634336fce552debea
87bbd02296d2b50d705c201ea632dd6dfc14cc3030f5e2929f37ef5e38ca6a96
88463164952c61d41850bf7c7630d97312292e8a16e6857f7d6f4e3a2e87181f
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc
8cda6ce4297fa9afd2c18bc5b6c82b6e9a9ecb14aa789b4463613f9f3e83ea49
8f71ee3131396059a7ce4ea2285bdf44944d113039168046e56f5397342d634c
8fa36bd11907c3ef579218c4df5362ffee40160a3b9517588091d184dbc84542
9437105216b40072cb0e46abbd437b2fda0c55456f88ac9cc205c7d6d291b44a
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
994c75c7c155810e924895ddf706066b1dc59153d7e1697990ba915768c2d669
99ddca22fc298fbc23f9048c7b3b8d87edd49aaa20e3b32ab169f2e859838e5a
9a1a0efffe8ee8b3f71057bab274fefdd302b8278fc6db961a51e5abd11c84d0
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9db81a132055cf6cc54a888c59269a0041d0908f209ff15aa83a706a0ddc250f
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
a41beb90930c67ea6f4c9587e11a265a74ab450c8644f52e8f13ce4ce33bf4b8
a460dd47416578b87e25489620b5e1a9b247b83b9fc752c327c088d194038279
a8741b8d6dbfc97f2eabdbce8c478ad25570f974f0511269548f172b092a4f9c
aad2e34518af325b26e993ae78d072b1852b697faea8475f93e4a2126f0c79d5
ab50a271594ffad54cda02ba744a01d5ba587b6ec47986ac6fab5270b4b11fec
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aea60f8e73e6cee0500383aab78ad431cfc702c4cbae6e0eac19dcd40d57513e
af0caaa76a3f65f64191491dbe470581ff3de976d4ad61bc8b37fb8a2e176d56
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b13eadabd41e1b23377f63d5092938030299b6e27c2867538e9d2425cd107c36
b1a88f9bb26d1a882acdbd2cae1799a4d199bcadc2e981efbb6eea116066837c
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b649471785908e92f637304d91f26ad0316639d9e60cf8eb28173a649bf08e7a
b7ca2ee955e7631732abb3e869c7a8d409ea414194bb22f7b6da2b5a6700beff
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
c315a586a97014d06130743d536503023b825a4634dea6f8027e003221c8d75b
c3688c4f3558318584c10d651297832000a94af276da9288d74045a69a85c17f
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c4b1207f3967b6dbbc322db1ed797c2cd78f243104fc5d02ad87e5ae46562167
c62418058518c2cf060ee5bcb552a1f7c5e469fef847df36f5ed6679ba5972b4
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
c80dba27ba5805b5565f6c7ac253adf27c17ec2c79ee2a035131e27dd9122710
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cf70c14844aa0b7431e66c5febfd3799f3fc88d8795ed8e250fe8754cf8a9365
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d1f113f4227720d00bfd0f59c290c95f3a56201167663e0864b7658d6bb7ac5c
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d31249078d40c63c95f9aff16dec0ec0e93a9026032c09f3837a74813342628f
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d682a58ae6689a2160e6b33f0de1f3df473f208dfc4ce218fdc283ae1a929688
d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
da60b73a6ac5cdaae68aeab1b9a4d672a153e206e8f26c879f6c0778633a5c05
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
def996c26badf06db6f6fbc63c17a8b274a4ad6bd7a321a5c846478c673e138c
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e1e6886dad3b0fede3b020f6afd66a46cc956cdd091e9860421d291b5c38540b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e44bcc635acacf68bb36e748a30962fcb6608ddf2b052ed7aec5b3e3eaceb02f
e4c6ca3d20bdb0f2409a1bf91b96064b53a7fe4eebf043b35b53d13573c1ecaa
e60f2e84479ef84b6dab41e801c595126f555f938d47e6a344ab7d5cfb112061
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d
e712b1ffac15cd104dceac573c53b307b08591cb2fea24a56897d0ba5f7c9f98
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
eec9b9615aec3514cc96a56e9ac20f789d5fbe3eee4372791e758d815670c978
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f0d4cadedff445959733d5072fa87ea6242d8611f91c3ca18260cb1f19a7369c
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f2c4bcca2fea5da786b4a3bf39fe254353065823d20ddcfa5f6fedb48eea8d0f
f4599d4eb5179ddffa24255aeee6766cc7415e5a4c9ae2a75b7969887591a7be
f6801ebae500fcd26fdc58c210f4248da89434391affc6809b8855916c023c3f
f747e9ab9f364435dbc86dfefe89f21e75b8669e392cbea1b34338037045359e
fc52f51348696d05b5f25877845497269d3ee06a3744b55d747a088eab39ac76
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548