Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On February 08 via api from IS

Summary

This website contacted 55 IPs in 10 countries across 35 domains to perform 208 HTTP transactions. The main IP is 77.247.84.129, located in Berlin, Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust RSA CA 2018 on July 27th 2018. 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 76 77.247.84.129 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
6 2a00:13c8:f5:... 25291 (SYSELEVEN...)
9 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
5 2a00:1450:400... 15169 (GOOGLE)
1 54.230.93.134 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
3 9 2.19.33.59 20940 (AKAMAI-ASN1)
1 2 80.82.201.88 48173 (UNBELIEVA...)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
8 216.58.208.34 15169 (GOOGLE)
9 136.243.3.97 24940 (HETZNER-AS)
1 185.64.189.112 62713 (AS-PUBMATIC)
1 173.241.240.220 36089 (OPENX-AS1)
5 185.86.139.19 201081 (SMARTADSE...)
1 3 184.30.220.71 20940 (AKAMAI-ASN1)
2 185.33.223.216 29990 (ASN-APPNEXUS)
4 2a00:1450:400... 15169 (GOOGLE)
1 7 2.18.234.72 16625 (AKAMAI-AS)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 142.93.164.163 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:200... 16509 (AMAZON-02)
1 77.247.84.149 25291 (SYSELEVEN...)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 52.86.164.68 14618 (AMAZON-AES)
4 2a00:1450:400... 15169 (GOOGLE)
2 52.216.10.45 16509 (AMAZON-02)
6 95.216.24.148 24940 (HETZNER-AS)
2 2 172.217.16.162 ()
1 2.16.122.151 20940 (AKAMAI-ASN1)
3 54.230.93.94 16509 (AMAZON-02)
4 2a00:1450:400... 15169 (GOOGLE)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
2 205.185.216.10 20446 (HIGHWINDS3)
2 52.28.163.57 16509 (AMAZON-02)
2 148.251.131.55 24940 (HETZNER-AS)
1 2a00:1450:401... 15169 (GOOGLE)
1 148.251.0.183 24940 (HETZNER-AS)
1 2.18.233.180 16625 (AKAMAI-AS)
1 2.18.232.130 16625 (AKAMAI-AS)
1 173.241.240.143 36089 (OPENX-AS1)
1 89.163.159.117 24961 (MYLOC-AS)
1 62.168.44.119 5588 (GTSCE GTS...)
2 52.31.228.50 16509 (AMAZON-02)
1 18.185.67.216 16509 (AMAZON-02)
1 2600:9000:200... 16509 (AMAZON-02)
1 34.252.169.181 16509 (AMAZON-02)
2 2 89.163.159.112 ()
2 34.254.7.51 16509 (AMAZON-02)
1 89.163.159.125 24961 (MYLOC-AS)
1 52.208.127.173 16509 (AMAZON-02)
208 55
Apex Domain
Subdomains
Transfer
97 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
15 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
113 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
9 adscale.de
hb.adscale.de
js.adscale.de
ih.adscale.de
13 KB
9 meetrics.net
lb65.s400.meetrics.net
3 KB
8 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
173 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
5 smartadserver.com
prg.smartadserver.com
6 KB
5 googletagservices.com
www.googletagservices.com
95 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 theadex.com
dmp.theadex.com
xpl.theadex.com
api.theadex.com
15 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
56 KB
3 adnxs.com
ib.adnxs.com
acdn.adnxs.com
3 KB
3 ioam.de
script.ioam.de
de.ioam.de
12 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 yieldlove-ad-serving.net
tracking.yieldlove-ad-serving.net
214 B
2 flashtalking.com
servedby.flashtalking.com
2 googleapis.com
imasdk.googleapis.com
81 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 google.de
adservice.google.de
346 B
2 nuggad.net
si.nuggad.net
adscale.nuggad.net
2 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
673 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
11 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 google.com
adservice.google.com
171 B
1 mxcdn.net
s400.mxcdn.net
44 KB
1 yieldlove.com
cdn-a.yieldlove.com
78 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
58 KB
208 35
Domain Requested by
75 www.golem.de www.golem.de
cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
www.googletagservices.com
9 lb65.s400.meetrics.net www.golem.de
9 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
9 video.golem.de www.golem.de
text
8 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
6 tt.onthe.io cdn.onthe.io
6 cpxl.golem.de www.golem.de
5 prg.smartadserver.com cdn-a.yieldlove.com
5 www.googletagservices.com cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
4 tpc.googlesyndication.com securepubads.g.doubleclick.net
4 ih.adscale.de 1 redirects js.adscale.de
www.golem.de
4 googleads.g.doubleclick.net pagead2.googlesyndication.com
4 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 hb.adscale.de 1 redirects www.golem.de
2 uss.xplosion.de
2 xpl.theadex.com 2 redirects
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 ssl.3.damoh.golem.de text
2 tracking.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 servedby.flashtalking.com cdn.stroeerdigitalgroup.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 cm.g.doubleclick.net 2 redirects
2 js.adscale.de cdn-a.yieldlove.com
cdn.stroeerdigitalgroup.de
2 s3.amazonaws.com www.golem.de
text
2 de.ioam.de 1 redirects www.golem.de
2 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
2 adservice.google.de www.googletagservices.com
2 ads.golem.de www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 eu-u.openx.net cdn-a.yieldlove.com
1 acdn.adnxs.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 ssl.1.damoh.golem.de text
1 s0.2mdn.net imasdk.googleapis.com
1 adscale.nuggad.net 1 redirects
1 cdn.radiantmediatechs.com www.golem.de
1 ad.yieldlab.net www.golem.de
1 d.agkn.com js.agkn.com
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 cpx.golem.de www.golem.de
1 js.agkn.com cdn.stroeerdigitalgroup.de
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 adservice.google.com www.googletagservices.com
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
208 61
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
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
Google Internet Authority G3
2019-01-23 -
2019-04-17
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
2018-08-10 -
2019-09-09
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
*.google.com
Google Internet Authority G3
2019-01-23 -
2019-04-17
3 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.pubmatic.com
COMODO RSA Organization Validation Secure Server CA
2016-04-12 -
2019-05-27
3 years crt.sh
*.openx.net
DigiCert ECC Secure Server CA
2018-04-03 -
2019-04-08
a year crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2018-03-02 -
2019-03-02
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.onthe.io
COMODO RSA Domain Validation Secure Server CA
2018-03-28 -
2019-03-28
a year crt.sh
*.google-analytics.com
Google Internet Authority G3
2019-01-23 -
2019-04-17
3 months crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2019-01-23 -
2019-04-17
3 months crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2018-04-19 -
2019-04-19
a year crt.sh
*.googleapis.com
Google Internet Authority G3
2019-01-23 -
2019-04-17
3 months crt.sh
servedby.flashtalking.com
GeoTrust RSA CA 2018
2018-02-13 -
2019-02-13
a year crt.sh
tracking.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2018-12-31 -
2019-03-31
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-01-21 -
2019-04-21
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2019-01-23 -
2019-04-17
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2018-11-20 -
2020-02-19
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2018-02-08 -
2019-03-23
a year 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 23 frames:

Primary Page: https://www.golem.de/
Frame ID: 6FE89FAFEBFB1485A20059DEBDA898ED
Requests: 182 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=454285249&gdpr=&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%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 8940D99C0017CEAD59F0F9DAF50C0352
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Frame ID: 31D23BD62054F150BFF180E7AE26908E
Requests: 1 HTTP requests in this frame

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

Frame: https://www.golem.de/microsite/abo/trial-medrec-m3-140.shtml
Frame ID: F565C6E515739104DA996A0E894524B5
Requests: 2 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=1549653848&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=1549653848419&bpp=31&bdt=924&fdt=329&idt=327&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&correlator=3628514731309&frm=20&pv=2&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=53&mdo=0&mso=0&u_tz=0&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=3998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=1&uci=1.ym0tu0r9htxk&fsb=1&xpc=qSUf37tVJG&p=https%3A//www.golem.de&dtd=366
Frame ID: ACF65C282F738140AEEF4FDC05DD4D8D
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=1549653848&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=1549653848450&bpp=8&bdt=955&fdt=361&idt=296&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=4719&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=2&uci=2.k9cjnrsesiw9&fsb=1&xpc=bVZ23Xc937&p=https%3A//www.golem.de&dtd=364
Frame ID: 0D1B51EFC8F2F7B9861541C475BF3F8E
Requests: 1 HTTP requests in this frame

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

Frame: https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Frame ID: F670131D494F8B705A2D3E5CA094FBAA
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=1549653848&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=1549653848458&bpp=6&bdt=964&fdt=436&idt=288&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=5408&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=3&uci=3.yxt7u1p0k7l4&fsb=1&xpc=wC8K1EYXA0&p=https%3A//www.golem.de&dtd=439
Frame ID: BF8B2FF8B32F15A3F787EB15490B63B7
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Frame ID: E05FB0020839AE74312E781684389C0E
Requests: 1 HTTP requests in this frame

Frame: https://servedby.flashtalking.com/imp/2/103389;3586916;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPBannerxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298292&ft_width=728&ft_height=90&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
Frame ID: D8A4F25328E43C7BB33864E1443F2B0E
Requests: 1 HTTP requests in this frame

Frame: https://servedby.flashtalking.com/imp/2/103389;3586917;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPSkyxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298293&ft_width=200&ft_height=600&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
Frame ID: 749B866D8B26E1E3B11A160EA17DD6CA
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Frame ID: 4C05298BD30DFA34498ADB0F3B897BAB
Requests: 2 HTTP requests in this frame

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

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: 0498AACBDF85B8D1BBA53FC61BAD85E3
Requests: 9 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
Frame ID: 729D7AD701A482577387B741784A35E3
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.277.1_de.html
Frame ID: 036A63B0C093086C7D754464A5211AA9
Requests: 1 HTTP requests in this frame

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

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

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 7F76FAD735A03AC1EE3B14AE8B4BAE0C
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: B1C2CCD27E2AE27482170EE151FDE94F
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: AC3D72D87CCF58CCBA602F37CAB84067
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

Overall confidence: 100%
Detected patterns
  • env /pbjs/i

Overall confidence: 100%
Detected patterns
  • html /<(?:iframe|img)[^>]+adnxs\.(?:net|com)/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i
  • env /^google_ad_/i
  • env /^__google_ad_/i
  • env /^Goog_AdSense_/i

Overall confidence: 100%
Detected patterns
  • env /^gaGlobal$/i

Overall confidence: 100%
Detected patterns
  • env /^googletag$/i

Overall confidence: 100%
Detected patterns
  • env /^szmvars$/i
  • env /^iam_data$/i

Overall confidence: 100%
Detected patterns
  • env /^jQuery$/i

Page Statistics

208
Requests

97 %
HTTPS

32 %
IPv6

35
Domains

61
Subdomains

55
IPs

10
Countries

3353 kB
Transfer

5936 kB
Size

19
Cookies

Page URL History

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

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

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 22
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 49
  • https://hb.adscale.de/dsh HTTP 307
  • https://hb.adscale.de/dsh?uu=626331549653848150
Request Chain 56
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4qs&i3=001002a8e6b485cc15c5dd757%3A1579721048212%3A1549653848212%3A.golem.de%3A1%3A1549653848212!ckm92e&n1=1&dntt=0&lt=1549653848220&ev=&cs=wvo327&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4qs&i3=001002a8e6b485cc15c5dd757%3A1579721048212%3A1549653848212%3A.golem.de%3A1%3A1549653848212%21ckm92e&n1=1&dntt=0&lt=1549653848220&ev=&cs=wvo327&mo=1&sr=71
Request Chain 113
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=2667560&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&utmhid=1177571155&utmr=-&utmp=%2F&utmht=1549653848365&utmac=UA-518800-2&utmcc=__utma%3D21769261.279128799.1549653848.1549653848.1549653848.1%3B%2B__utmz%3D21769261.1549653848.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1441035031&utmredir=1&utmu=qRQAAAAAAAAAAAAAAAAAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
Request Chain 133
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=e9f7e30eaec7a49a8083ef2bc5e6e500&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3De9f7e30eaec7a49a8083ef2bc5e6e500%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=e9f7e30eaec7a49a8083ef2bc5e6e500&userId=adscale-user:626331549653848150
Request Chain 134
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=e9f7e30eaec7a49a8083ef2bc5e6e500
Request Chain 135
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=6ffjDq7HpJqAg-8rxeblAA HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=6ffjDq7HpJqAg-8rxeblAA&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 136
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=e9f7e30eaec7a49a8083ef2bc5e6e500
Request Chain 151
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=https%3A%2F%2Fgolem.de%2F&nuggl=https%3A%2F%2Fih.adscale.de%2Fadscale-ih%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYzU5MzQw%2Fuu%2F626331549653848150%2Fts%2F1549653848742%2Fv%2F2%2Fhid%2F431%2Fssl%2F1%2Flb%2Fnode20.lb.adscale.de%2Fws%2Fhttps%253A%252F%252Fwww.golem.de%252F%2Fnvars%2FNUGGVARS HTTP 302
  • https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Request Chain 208
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001819792024170135&axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1001819792024170135

208 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
188 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0096b27352f1c27645b5e29aed423ea948d0f27319be7a86dab5333d0792f83f
Security Headers
Name Value
Strict-Transport-Security max-age=11001100; 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Server
nginx
Date
Fri, 08 Feb 2019 19:24:07 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_67; expires=Sat, 09-Feb-2019 07:24:07 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
Cache-Control
private
Vary
User-Agent, Accept-Encoding

Redirect headers

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

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-12420"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:07 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
242 KB
58 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:189::5f76 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
77c9333e464ab137a9740e202a30bed96b6313aaacdf9807af403b8bed9f2991

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-amz-request-id
A3E5C8393EDD1761
status
200
access-control-max-age
86400
content-length
59057
x-amz-id-2
8js1DXCZrYlwPsZiLxi97h/GSEfJU0DHMe1ciLkxghl+OAubav2n0Tj0RcWz1I+DaO1BK8XOjlU=
last-modified
Fri, 08 Feb 2019 15:54:38 GMT
server
AmazonS3
etag
"f1ac72f04d8a642184e5a7e93aa64c78"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=643
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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Mon, 11 Mar 2019 19:24:07 GMT
139268-186652-186650_rc.jpg
www.golem.de/1902/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1902/139268-186652-186650_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
590c096c9b4ba9b63d1b6178f6ede3f65291382f3d2521a61470e00697b17417

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Fri, 08 Feb 2019 09:22:04 GMT
Server
nginx
ETag
"5c5d4a3c-3eed"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16109
Expires
Mon, 11 Mar 2019 19:24:07 GMT
139287-186759-186756_rc.jpg
www.golem.de/1902/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139287-186759-186756_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c64bd3e408892fb14bca8aee04daaafecfd41c095c4104890145b76733f004e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Fri, 08 Feb 2019 17:37:02 GMT
Server
nginx
ETag
"5c5dbe3e-162c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5676
Expires
Mon, 11 Mar 2019 19:24:07 GMT
139279-186713-186710_rc.jpg
www.golem.de/1902/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139279-186713-186710_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
090e40ad508a33afdc4d20efb3e4871b3099ef574b03cf1ad16e0ac31f005589

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Fri, 08 Feb 2019 13:08:02 GMT
Server
nginx
ETag
"5c5d7f32-181c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6172
Expires
Mon, 11 Mar 2019 19:24:07 GMT
139286-186750-186747_rc.jpg
www.golem.de/1902/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139286-186750-186747_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
db04805116903120f8993561fa2b65d27c430eab2ba24af2bf13a29f61e23a15

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Fri, 08 Feb 2019 17:20:03 GMT
Server
nginx
ETag
"5c5dba43-163f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5695
Expires
Mon, 11 Mar 2019 19:24:07 GMT
139261-186625-186622_rc.jpg
www.golem.de/1902/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1902/139261-186625-186622_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ea8845fef67005feffae85e04217c4bb0ae6309db8e09ea778ae55b03cf8b08e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Thu, 07 Feb 2019 17:09:03 GMT
Server
nginx
ETag
"5c5c662f-2219"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8729
Expires
Mon, 11 Mar 2019 19:24:07 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=1549652945&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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
blender28tut-snap.jpg
video.golem.de/teaser/1/1/22453/thumb-high-1000/
89 KB
89 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22453/thumb-high-1000/blender28tut-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
5857a9b5acd2847fe72d2f92cc05c783fced58f86b86d64b594568556bf11ff8

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Wed, 06 Feb 2019 11:01:09 GMT
Server
nginx
ETag
"5c5abe75-16204"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
90628
Expires
Mon, 11 Mar 2019 19:24:07 GMT
vii-amd.jpg
video.golem.de/teaser/1/1/22461/thumb-high-1000/
116 KB
116 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22461/thumb-high-1000/vii-amd.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
4a1485181308d9761919d54c30a97edbd2730f8b8a314540464d895fda83b372

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Thu, 07 Feb 2019 13:38:59 GMT
Server
nginx
ETag
"5c5c34f3-1cf35"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
118581
Expires
Mon, 11 Mar 2019 19:24:07 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=1549653841&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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
139065-185677-185676_rc.jpg
www.golem.de/1902/
181 KB
182 KB
Image
General
Full URL
https://www.golem.de/1902/139065-185677-185676_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
833f45fc1beac7fade0751bd74893f26f4dd58009718428a51951fda08831f28

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Tue, 05 Feb 2019 11:00:04 GMT
Server
nginx
ETag
"5c596cb4-2d5a7"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
185767
Expires
Mon, 11 Mar 2019 19:24:07 GMT
138987-185310-185309_rc.jpg
www.golem.de/1902/
152 KB
153 KB
Image
General
Full URL
https://www.golem.de/1902/138987-185310-185309_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1decdc030a196deb840030e5e5feca23b3730aca34329be00ac872d50041f96d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Mon, 04 Feb 2019 08:08:04 GMT
Server
nginx
ETag
"5c57f2e4-260f2"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
155890
Expires
Mon, 11 Mar 2019 19:24:07 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-190c7"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:07 GMT
longread-swiper_128-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_128-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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fa1ef5ada57aee13df27471b97964993e328305da6f3c7e5887bab16f2fd39ed

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 16:35:48 GMT
Server
nginx
ETag
W/"5c49e964-94c"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:07 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
474 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Fri, 08 Feb 2019 19:24:07 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Content-Type
application/javascript
Cache-Control
no-store, no-cache, must-revalidate
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
430 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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Mon, 11 Mar 2019 19:24:07 GMT
iam.js
script.ioam.de/
31 KB
10 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.9 0010
Resource Hash
78c3e5a54296560caf960f67bb3f6b57688027079ce303406935bcab39694c8f

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Content-Encoding
gzip
Last-Modified
Fri, 08 Feb 2019 19:24:07 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0010
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
privat, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Fri, 08 Feb 2019 21:24:07 GMT
gpt.js
www.googletagservices.com/tag/js/
40 KB
11 KB
Script
General
Full URL
https://www.googletagservices.com/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7f4c79ef3b9ad8186e44d5f06491aa0947af98f0e68c07708f900f57a5f2e141
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"77 / 261 of 1000 / last-modified: 1549580749"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
10785
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:07 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
263 KB
78 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
54.230.93.134 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-93-134.fra2.r.cloudfront.net
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
044732b2ed3d6c2866928c6aecc2421d9d4826465eb2459f83ec922a4fcebe30

Request headers

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

Response headers

date
Fri, 08 Feb 2019 16:43:54 GMT
content-encoding
gzip
server
nginx/1.14.0 (Ubuntu)
age
9613
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=10800, public
x-amz-cf-id
_IkUAeA-gUA369LNHYU2y5sOgohxs-9jNs6TUoTK5mbwW03up6rmrA==
via
1.1 7c2d73d3cd46e357090188fa2946f746.cloudfront.net (CloudFront)
expires
Fri, 08 Feb 2019 19:43:54 GMT
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
114 KB
44 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 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
8f8d8533c1c578b9407cec494b55969998d0f8916fe753931978da699b597b4b

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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=39491
Connection
keep-alive
Content-Type
text/javascript
Content-Length
45131
Expires
Sat, 09 Feb 2019 06:22:18 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Fri, 08 Feb 2019 19:24:07 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/
848 B
940 B
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
6efecc5b7aaa0fab574959f9f8fdf2bbdb482ebb285bcbbb259c5d7e060c8b34

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
263
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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
Mon, 11 Mar 2019 19:24:07 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
Mon, 11 Mar 2019 19:24:07 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
Mon, 11 Mar 2019 19:24:07 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

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

Response headers

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

Request headers

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

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

Response headers

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

Request headers

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: 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
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
Mon, 11 Mar 2019 19:24:07 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: 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
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
Mon, 11 Mar 2019 19:24:07 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: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
104
x-xss-protection
1; mode=block
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: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_2019020401.js
securepubads.g.doubleclick.net/gpt/
181 KB
62 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
sffe /
Resource Hash
2f4bdb9f287ec32f91fe0d396715fb99889cf89c5912a4ee8143e5a74410452e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 04 Feb 2019 18:27:58 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="44,43,39"
content-length
63439
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:07 GMT
submit
lb65.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb65.s400.meetrics.net/bb-mx/submit?/rkiFBNAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtwAxtAyxAtxAw6A1wAt2A35A2wAwtAyuAxwA2uAytAxkExlE4mEwkEL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSxZBPAAAAAAAAAOAAAAGEAAAAAAZwSxZBBRksFAQtjFQmsrSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 08 Feb 2019 19:24:07 GMT
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFCOAAATkzFARksFAQtjFwtJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:07 GMT
btn-follow-sp4.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4.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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_126-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_126-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:07 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-fb2"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4018
Expires
Mon, 11 Mar 2019 19:24:07 GMT
dmp
tracking.m6r.eu/sync/
119 B
614 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
2.19.33.59 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
33664693ea7d566b564d9ca99a7644d3d1d83a8bcf485cefe7fccb895e7037e9

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:07 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
122
translator
hbopenbid.pubmatic.com/
0
114 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

status
204
date
Fri, 08 Feb 2019 19:24:08 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
arj
yieldlove-d.openx.net/w/1.0/
14 KB
2 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=0&tws=1600x1200&be=1&bc=hb_pb_2.1.4&dddid=c80ebfa6-8662-4487-accd-30d3fd84e5f6%2C25839866-9446-41c5-9d23-45cc65ddfd4a%2C16286798-c776-44ff-b456-b9ef39255ce0%2Cedc60849-5ae3-412e-ae38-887608207dd1%2Ca0079b7c-26d8-4f13-8a81-8a83d1dabedd%2C630b2672-86ca-4b3e-91e2-df241262730d%2C4a938338-7d00-46fe-af8e-bc453bec0a97&nocache=1549653848082&x_gdpr_f=1&aus=300x250%7C300x600%2C160x600%2C120x600%7C300x600%2C300x250%7C770x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C770x250%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbillboard%2Cbanner%2Cbillboard2%2Cbanner3&auid=540523394%2C540523392%2C540523393%2C540523395%2C540523387%2C540523389%2C540523390&
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_ECDSA, CHACHA20_POLY1305
Server
173.241.240.220 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-220.xa.dc.openx.org
Software
OXGW/16.121.0 /
Resource Hash
5a890063680acbda864c949d5da1a1b0da6e91fcc991b87ced245bbd43b58447

Request headers

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

Response headers

pragma
no-cache
date
Fri, 08 Feb 2019 19:24:08 GMT
content-encoding
gzip
server
OXGW/16.121.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
expires
Mon, 26 Jul 1997 05:00:00 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.139.19 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
X-SMRT-D
6%3b30%3b78
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
dsh
hb.adscale.de/
Redirect Chain
  • https://hb.adscale.de/dsh
  • https://hb.adscale.de/dsh?uu=626331549653848150
0
-1 B
XHR
General
Full URL
https://hb.adscale.de/dsh?uu=626331549653848150
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
184.30.220.71 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Location
//hb.adscale.de/dsh?uu=626331549653848150
P3P
CP=NOI PSA OUR
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
0

Redirect headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Access-Control-Allow-Origin
https://www.golem.de
P3P
CP=NOI PSA OUR
Location
//hb.adscale.de/dsh?uu=626331549653848150
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
0
prebid
ib.adnxs.com/ut/v3/
2 KB
2 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
1b2e6a51b671e12d41d5617a0051365383b54f01f4bebbff7d97e45bc4d0b350
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:10 GMT
Content-Encoding
gzip
Transfer-Encoding
chunked
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.26:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
1c5b264f-1376-4e1a-9dbb-c7fe651d08f7
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
79 KB
30 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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dd393663ee4331edfa153519f0a4d33cc40f0d460e36ea0f800a5203e579bf7b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
30124
x-xss-protection
1; mode=block
server
cafe
etag
3709790650028550618
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 08 Feb 2019 19:24:08 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-7ff"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 GMT
gx-ads.js
ads.golem.de/track.ads/
226 B
594 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=7139004529968851&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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Mon, 11 Mar 2019 19:24:08 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 05 Feb 2019 10:14:37 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
642
Expires
Sat, 09 Feb 2019 19:24:08 GMT
dsh
hb.adscale.de/
11 B
393 B
XHR
General
Full URL
https://hb.adscale.de/dsh?uu=626331549653848150
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
184.30.220.71 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
846949c5a40e3ffbb702473e54dfac0646541aa624a844369b6e24e51ddaf96b

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
P3P
CP=NOI PSA OUR
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/plain
Content-Length
11
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4q...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4q...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4qs&i3=001002a8e6b485cc15c5dd757%3A1579721048212%3A1549653848212%3A.golem.de%3A1%3A1549653848212%21ckm92e&n1=1&dntt=0&lt=1549653848220&ev=&cs=wvo327&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0023
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0023
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
Fri, 08 Feb 2019 19:24:08 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0023
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
Location
/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0010&i2=001002a8e6b485cc15c5dd757&ep=1579089342&vr=412&id=s9k4qs&i3=001002a8e6b485cc15c5dd757%3A1579721048212%3A1549653848212%3A.golem.de%3A1%3A1549653848212%21ckm92e&n1=1&dntt=0&lt=1549653848220&ev=&cs=wvo327&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Thu, 08 Feb 2018 19:24:08 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
71 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.163 North York, Canada, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
c6756941cbf7cdda404625e008c9f1436fbd5d57a6559c177971ff5c4cd7b9d9

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Dec 2018 11:43:25 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5c1b805d-11a7c"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-10
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Sat, 09 Feb 2019 11:48:12 GMT
ga.js
www.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:821::200e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 16 Jan 2019 20:01:45 GMT
server
Golfe2
age
5652
date
Fri, 08 Feb 2019 17:49:56 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
17168
expires
Fri, 08 Feb 2019 19:49:56 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:200d:3800:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

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

Response headers

date
Thu, 07 Feb 2019 22:36:27 GMT
via
1.1 64150aec025f89247bcddad7c210f6cb.cloudfront.net (CloudFront)
last-modified
Tue, 04 Dec 2018 22:35:38 GMT
server
AmazonS3
age
74867
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
accept-ranges
bytes
content-length
3167
x-amz-cf-id
eN1SQVfwZK4NjskzL0bziGabxyjltcYlByjJNPwKpe6r0r-jDtzc9Q==
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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-113e8"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-1e61"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 GMT
nexusone-snap.jpg
video.golem.de/teaser/1/1/22436/thumb-high-1000/
94 KB
94 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22436/thumb-high-1000/nexusone-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
3bdfb8c773a8465b93159b86419d39d02a237ae0677f5a05735cd4885f5f30b3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 01 Feb 2019 10:12:21 GMT
Server
nginx
ETag
"5c541b85-177ed"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
96237
Expires
Mon, 11 Mar 2019 19:24:08 GMT
rage2angespielt2.jpg
video.golem.de/teaser/1/1/22424/thumb-high-1000/
101 KB
102 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22424/thumb-high-1000/rage2angespielt2.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
2a0cc2f9a8f5cf7011c49314189debe5165338fb4f373806371c339ae5fdbd09

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Tue, 29 Jan 2019 09:41:00 GMT
Server
nginx
ETag
"5c501fac-1956a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
103786
Expires
Mon, 11 Mar 2019 19:24:08 GMT
ottobock-snap.jpg
video.golem.de/teaser/1/1/22432/thumb-high-1000/
102 KB
102 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22432/thumb-high-1000/ottobock-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
3bd5243ad6ba963e62724f92d5b7a4369cb3ef4f465b2afb4411c958fb16bad6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 31 Jan 2019 09:14:39 GMT
Server
nginx
ETag
"5c52bc7f-19613"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
103955
Expires
Mon, 11 Mar 2019 19:24:08 GMT
tuxkrt-snap.jpg
video.golem.de/teaser/1/1/22418/thumb-high-1000/
127 KB
127 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22418/thumb-high-1000/tuxkrt-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
c4fa3b2c71d1b1f1746a4487ce84258e19183285036bd01b14ae515d63741e1d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 25 Jan 2019 15:03:31 GMT
Server
nginx
ETag
"5c4b2543-1fad6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
129750
Expires
Mon, 11 Mar 2019 19:24:08 GMT
anno-snap.jpg
video.golem.de/teaser/1/1/22410/thumb-high-1000/
157 KB
157 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22410/thumb-high-1000/anno-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
338080e9326f7e5fffc59dacebef59b51a74b8334d85f101fc0673d0599625fe

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 24 Jan 2019 14:10:19 GMT
Server
nginx
ETag
"5c49c74b-272d6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
160470
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139285-186746-186743_rc.jpg
www.golem.de/1902/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139285-186746-186743_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1140fd4da378b7e5db283620fc0810c86ae3a207615405b298849705205c2870

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 17:00:03 GMT
Server
nginx
ETag
"5c5db593-17df"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6111
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139199-186333-186330_rc.jpg
www.golem.de/1902/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1902/139199-186333-186330_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7a032e17dad6979c2378055346b60f77465a08cb4750d475d0ce104bcbaf45d8

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 09:25:04 GMT
Server
nginx
ETag
"5c5d4af0-1c62"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7266
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139283-186739-186736_rc.jpg
www.golem.de/1902/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1902/139283-186739-186736_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fbb05130132c5a9a055e5ef8a03c199db12f873d28d81e5e51430077e6095ced

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 16:30:03 GMT
Server
nginx
ETag
"5c5dae8b-27e0"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10208
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139195-186704-186701_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139195-186704-186701_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5828a86e25bdf5e71ab087fdb26114a27776475d0047f5e4d2618cdaac89eaa9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 11:11:03 GMT
Server
nginx
ETag
"5c5d63c7-1f3a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7994
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139284-186735-186732_rc.jpg
www.golem.de/1902/
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/1902/139284-186735-186732_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4971c47346b2590bcd2db1c5b4f6a0577de034ef8e946a61b49bed6d7955ea52

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 16:05:02 GMT
Server
nginx
ETag
"5c5da8ae-2b26"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11046
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139024-186033-186029_rc.jpg
www.golem.de/1902/
153 KB
154 KB
Image
General
Full URL
https://www.golem.de/1902/139024-186033-186029_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ed16c1f664eb713dc8773a346c8122cc5a3b85153188eb7a4ed9ac1ba6b26b1e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 04 Feb 2019 11:06:04 GMT
Server
nginx
ETag
"5c581c9c-264c6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
156870
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139040-185964-185961_rc.jpg
www.golem.de/1902/
107 KB
107 KB
Image
General
Full URL
https://www.golem.de/1902/139040-185964-185961_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
96b34eeaf8520b91d67bb57b8bc953139aaa54f4a5e0a3f62866878f5a645c91

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 01 Feb 2019 10:59:05 GMT
Server
nginx
ETag
"5c542679-1abf8"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
109560
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139282-186726-186723_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139282-186726-186723_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d6d8da7e164a270a65bb6be28fe504dc255b756bee5bdee986c83b7dc20eccef

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 15:28:03 GMT
Server
nginx
ETag
"5c5da003-1f86"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8070
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139280-186722-186719_rc.jpg
www.golem.de/1902/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1902/139280-186722-186719_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
31e2a9f454552b7412a580653be630b1c3d1a8e148617c96d43e26dbcdbd44d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 15:04:03 GMT
Server
nginx
ETag
"5c5d9a63-20ab"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8363
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139240-186530-186527_rc.jpg
www.golem.de/1902/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139240-186530-186527_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ecd31c35499276d34bebfe2272b8a76701bf22baf761978697369558a9b47f66

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmb=21769261.0.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 09:19:05 GMT
Server
nginx
ETag
"5c5bf809-14bd"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5309
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139256-186614-186613_rc.jpg
www.golem.de/1902/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1902/139256-186614-186613_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1d93f6aa64d0f596f676e2660dce621ab5a5e1f3077890075d1386f7307dd763

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmb=21769261.0.10.1549653848; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 15:45:04 GMT
Server
nginx
ETag
"5c5c5280-18f1"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6385
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139188-186453-186450_rc.jpg
www.golem.de/1902/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139188-186453-186450_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
15c878b8a80454305b10f9ce86823000c153c59e7b692b96e23be7e387403be3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmb=21769261.0.10.1549653848; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 08:59:03 GMT
Server
nginx
ETag
"5c5bf357-1866"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6246
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139277-186709-186706_rc.jpg
www.golem.de/1902/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1902/139277-186709-186706_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f208071c0a1d85704129506a6e109e14ec3a772a66acb0baa6be4aef62a97810

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmb=21769261.0.10.1549653848; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 12:00:02 GMT
Server
nginx
ETag
"5c5d6f42-13e4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5092
Expires
Mon, 11 Mar 2019 19:24:08 GMT
138906-186590-186589_rc.jpg
www.golem.de/1902/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/138906-186590-186589_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a3eb852dd3cdb300c28ecc0fb07be579ac8e7ad196d282119b2681cc39745cef

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 14:00:04 GMT
Server
nginx
ETag
"5c5c39e4-159e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5534
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139276-186699-186696_rc.jpg
www.golem.de/1902/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1902/139276-186699-186696_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1ba08df633f3e0eebcdf391b73904780323122eb03d45ca8990a70f8a6d938c7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 11:45:03 GMT
Server
nginx
ETag
"5c5d6bbf-22e8"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8936
Expires
Mon, 11 Mar 2019 19:24:08 GMT
137327-177418-177414_rc.jpg
www.golem.de/1810/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137327-177418-177414_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ebe0d06023454b71e1aa256b52e5fdcab4871605f8b54de2a47a1628df1114f7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 26 Oct 2018 10:03:04 GMT
Server
nginx
ETag
"5bd2e658-14ce"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5326
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139206-186374-186370_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139206-186374-186370_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d04ecd5fede0141fe8ff1fcc42d1f73cbf808d25cc6be9fe3d29d51b6f6f646e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 07:00:03 GMT
Server
nginx
ETag
"5c5bd773-202d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8237
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139275-186695-186692_rc.jpg
www.golem.de/1902/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1902/139275-186695-186692_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
11a4f1849f3313f40aba1b253da1a8604197176c10fd68a94f106ee341e1e6fd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 10:54:02 GMT
Server
nginx
ETag
"5c5d5fca-192f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6447
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139274-186678-186675_rc.jpg
www.golem.de/1902/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1902/139274-186678-186675_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
89c03f3d5c20fc7fb33474cb1afff2eece540a441b6cd977f3d8b5d8e0ac5545

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 10:32:02 GMT
Server
nginx
ETag
"5c5d5aa2-2523"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9507
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139113-185903-185900_rc.jpg
www.golem.de/1902/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1902/139113-185903-185900_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ed5f81f4053d02ce371787effafb34596a1f0285b67d33a98084d6b60de306ff

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 11:00:04 GMT
Server
nginx
ETag
"5c5c0fb4-156f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5487
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139272-186664-186660_rc.jpg
www.golem.de/1902/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1902/139272-186664-186660_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e9d409d55f3f28fa7f5faf4a90dce3155884e547af168e8d6c07e56bf36022d8

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 10:16:02 GMT
Server
nginx
ETag
"5c5d56e2-27f4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10228
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139019-186154-186150_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139019-186154-186150_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7d6094828306f021a5dbeac0442102b2c415466065172be558a0907065f95ae7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Wed, 06 Feb 2019 08:05:04 GMT
Server
nginx
ETag
"5c5a9530-1e68"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7784
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139271-186671-186666_rc.jpg
www.golem.de/1902/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1902/139271-186671-186666_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b6ce0604a2410f838abe06afdb2a5c0c8c41cf7a47a534a9b47d3ded1e7fb70

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 09:56:03 GMT
Server
nginx
ETag
"5c5d5233-2437"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9271
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139273-186674-186669_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139273-186674-186669_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
47593998f1b54a63b94bd293ae7113ce1f15d5feb3050fdb07fc0d9c917c2d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 09:43:02 GMT
Server
nginx
ETag
"5c5d4f26-1eb5"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7861
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139241-186536-186531_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139241-186536-186531_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9a0b20fad6f2ba7ae979144379f72dbe01be73478d0da22237b1e221f888182e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 07 Feb 2019 09:47:04 GMT
Server
nginx
ETag
"5c5bfe98-1e96"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7830
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139269-186656-186655_rc.jpg
www.golem.de/1902/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139269-186656-186655_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
769edb4f2042dedb4b17c881d89372431817ff8f5525fbc225a2e817164d69c6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 09:31:03 GMT
Server
nginx
ETag
"5c5d4c57-1d2c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7468
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139267-186649-186646_rc.jpg
www.golem.de/1902/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139267-186649-186646_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c2461a2dbebcc3ea6e1a4de2017febaa462b38dd801c20c6ac4fae69446c74d8

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 09:09:02 GMT
Server
nginx
ETag
"5c5d472e-1dd4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7636
Expires
Mon, 11 Mar 2019 19:24:08 GMT
139266-186645-186642_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/139266-186645-186642_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
06f2d536523ad5a938ec4ab66d891e6498b4a1a851679a7fd68fabcdecc9dd75

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 07:53:03 GMT
Server
nginx
ETag
"5c5d355f-207f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8319
Expires
Mon, 11 Mar 2019 19:24:08 GMT
138898-185006-185002_rc.jpg
www.golem.de/1902/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1902/138898-185006-185002_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
482866dfff8b35edec7f2d9000b1a6a600015ea168e0d3939840226928237f34

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Wed, 06 Feb 2019 11:04:04 GMT
Server
nginx
ETag
"5c5abf24-2021"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8225
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138195-181908-181906_rc.jpg
www.golem.de/1901/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138195-181908-181906_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3c91d1c8911b1aba7e2ff73fa73bf3fe435f204e2cae30324c61e8ec949722

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Tue, 29 Jan 2019 11:00:07 GMT
Server
nginx
ETag
"5c503237-587c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22652
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139053-185822-185820_rc.jpg
www.golem.de/1901/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139053-185822-185820_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e733efc482aadb49da8e01443e88c60b2d493e69060d80926a01f88a2f3194fd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 31 Jan 2019 11:09:05 GMT
Server
nginx
ETag
"5c52d751-53cc"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21452
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139077-185723-185721_rc.jpg
www.golem.de/1901/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139077-185723-185721_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
07f489067707b27cb4f3adcd75497091b1d0da19b9155042542c3995ac45a8c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 31 Jan 2019 07:55:05 GMT
Server
nginx
ETag
"5c52a9d9-44c0"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17600
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139044-185664-185662_rc.jpg
www.golem.de/1901/
31 KB
31 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139044-185664-185662_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bbcd9206f18adb2706e43a0992291fe729705c9559c5ab9485a370a39e9e6916

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Wed, 30 Jan 2019 11:22:06 GMT
Server
nginx
ETag
"5c5188de-7a9a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
31386
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139082-185749-185747_rc.jpg
www.golem.de/1901/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139082-185749-185747_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8e8e2814044ff1f3a9cba0f6ad010381574d223469e0eb2092ecb2a16ab4e814

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Wed, 30 Jan 2019 16:46:05 GMT
Server
nginx
ETag
"5c51d4cd-402e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16430
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138934-185118-185116_rc.jpg
www.golem.de/1901/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138934-185118-185116_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
80c137727b2f7d6cdf51ce10bfc5a283c251bebad8b8347d44ede4d698b43dc9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 28 Jan 2019 11:08:06 GMT
Server
nginx
ETag
"5c4ee296-4082"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16514
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138830-184767-184765_rc.jpg
www.golem.de/1901/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138830-184767-184765_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c65e80a3a68235b58e4ba1706c3d8bc9b8688cf1630189a24b1d731b2b9ad653

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 25 Jan 2019 11:02:06 GMT
Server
nginx
ETag
"5c4aecae-437a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17274
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139014-185428-185426_rc.jpg
www.golem.de/1901/
19 KB
19 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139014-185428-185426_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1a78a63c292f0ea293e23ca26d892db126a30d954222cb3359a8daa132c085d1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 28 Jan 2019 13:00:06 GMT
Server
nginx
ETag
"5c4efcd6-4c53"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
19539
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_139016-185423-185421_rc.jpg
www.golem.de/1901/
19 KB
19 KB
Image
General
Full URL
https://www.golem.de/1901/sp_139016-185423-185421_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1cb02a39c377c012fc18cb3c52bf5f17d77253aa33e50d15ab0ce10407ecf520

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 28 Jan 2019 14:00:07 GMT
Server
nginx
ETag
"5c4f0ae7-4c06"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
19462
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138983-185283-185281_rc.jpg
www.golem.de/1901/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138983-185283-185281_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f3e13da09f8db2744bc360cbd94ffc8ed73319122d7d184e85146742161a30d2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Tue, 29 Jan 2019 07:59:04 GMT
Server
nginx
ETag
"5c5007c8-602b"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24619
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138712-184035-184033_rc.jpg
www.golem.de/1901/
14 KB
14 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138712-184035-184033_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e1128c619d85bfee95f4329ff24900477b8bdba0c439a4494624ced4679e60aa

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Sun, 27 Jan 2019 08:00:04 GMT
Server
nginx
ETag
"5c4d6504-3812"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
14354
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138876-185187-185184_rc.jpg
www.golem.de/1901/
25 KB
26 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138876-185187-185184_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2e34b4c0baacbe84542103b107ea2d1771b75aae6e15c15b46088d596ced6292

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 25 Jan 2019 08:01:05 GMT
Server
nginx
ETag
"5c4ac241-6592"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26002
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138981-185373-185371_rc.jpg
www.golem.de/1901/
27 KB
27 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138981-185373-185371_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b74578b4537dcee4a4aaa9a18aec01ecebc76b3d35a15cc4507a1cfeca3a638e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Mon, 28 Jan 2019 08:02:05 GMT
Server
nginx
ETag
"5c4eb6fd-6ace"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
27342
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138964-185203-185201_rc.jpg
www.golem.de/1901/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138964-185203-185201_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
db87260506f0efeb56198fe74de79e4116081f3e6a00ce50e3bd71088ff239d2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Thu, 24 Jan 2019 18:00:05 GMT
Server
nginx
ETag
"5c49fd25-627a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
25210
Expires
Mon, 11 Mar 2019 19:24:08 GMT
sp_138764-184254-184252_rc.jpg
www.golem.de/1901/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1901/sp_138764-184254-184252_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
aae78cf3b1dd9018e6e1c36ff993d0d1414f5cc0da316942e760bcadbf161626

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Wed, 23 Jan 2019 11:02:06 GMT
Server
nginx
ETag
"5c4849ae-446a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17514
Expires
Mon, 11 Mar 2019 19:24:08 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1549653848&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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpx.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Fri, 08 Feb 2019 19:24:08 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
sp_bW2P-278000-i_rc.jpg
www.golem.de/9143/
68 B
486 B
Image
General
Full URL
https://www.golem.de/9143/sp_bW2P-278000-i_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
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
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=2667560&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&u...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
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=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c08::9a , Ireland, 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Fri, 08 Feb 2019 19:24:08 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 08 Feb 2019 19:24:08 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=279128799.1549653848&jid=1441035031&_v=5.7.2&z=2667560
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
365
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame 8940
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=454285249&gdpr=&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%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.86.164.68 Ashburn, United States, ASN14618 (AMAZON-AES - Amazon.com, Inc., US),
Reverse DNS
ec2-52-86-164-68.compute-1.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Fri, 08 Feb 2019 19:24:08 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%3A%2FQ9q6uhDRw%2F%2FQoWHvZ52AFMAayf6pAQ4;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAj8JPYI_CT2AAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
481
Connection
keep-alive
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&n4=0&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&n70=3&n71=1&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: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5c327d2a8b831e9ae35540a9b163485242b84429247cf8d69608eea506d97987

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 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
1507
rmpslider-rl_128-min.js
www.golem.de/staticrl/scripts/radiant/
16 KB
7 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_128-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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
34f0850833ea2339f61d17475c7d5d228be8f1f56fd3f836ccb72f30fb9c75d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848
Connection
keep-alive
Cache-Control
no-cache
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 16:39:03 GMT
Server
nginx
ETag
W/"5c49ea27-3e1b"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
244
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 08 Feb 2019 19:24:08 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 08 Feb 2019 19:24:08 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 08 Feb 2019 19:24:08 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 08 Feb 2019 19:24:08 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"
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/
193 KB
71 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
772936df0f7b91673c2c52dbd0f83f9382d8ad1218a620bbb453cb8a0e3ea251
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
72978
x-xss-protection
1; mode=block
server
cafe
etag
11843833417236783916
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 08 Feb 2019 19:24:08 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/ Frame 31D2
193 KB
71 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
772936df0f7b91673c2c52dbd0f83f9382d8ad1218a620bbb453cb8a0e3ea251
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
72978
x-xss-protection
1; mode=block
server
cafe
etag
11843833417236783916
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 08 Feb 2019 19:24:08 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
235 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 18:52:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 05 Feb 2019 20:02:09 GMT
server
sffe
age
1886
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=43200
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
125
x-xss-protection
1; mode=block
expires
Sat, 09 Feb 2019 06:52:42 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190204/r20190131/ Frame CC4B
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190204/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20190204/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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 05 Feb 2019 01:51:22 GMT
expires
Tue, 19 Feb 2019 01:51:22 GMT
content-type
text/html; charset=UTF-8
etag
14090563764879558401
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6959
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
322366
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
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.10.45 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Last-Modified
Fri, 08 Feb 2019 18:40:04 GMT
Server
AmazonS3
x-amz-request-id
A530B66549D355B2
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
iCTlGOESDk2RAGGd+Z1af3I+UgrJl803hGS354TR8r1FLiZTEDxmPH28Ar/X4w98pm6XKJWVgAE=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f
Connection
keep-alive
Cache-Control
no-cache
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-5e9f0"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 GMT
userconnect.js
js.adscale.de/
12 KB
4 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
bb7c8a563d7d215b6c66fa0fcc6d637ea9b8c1083de7ea83c51900eee4415d8a

Request headers

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

Response headers

x-amz-version-id
WF7PcEF0ILELyyEoEuh1QO.QTSerXv8j
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 03:03:26 GMT
Server
AmazonS3
x-amz-request-id
BC03B04B85F9836B
ETag
"ed02917e314333b4abe723cbcec23831"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 08 Feb 2019 19:24:08 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3764
x-amz-id-2
6VDPDdQAbn7Ra+DtjAXDVW1LvPbj/o1FTGiyfg2/+naPSbbxiBmb2yRzggyliyaSUTCGxGlfhMM=
/
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_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&1549653848565
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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
514 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=8&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=940ff91d9.8a31a7f20_1549653848561&1549653848567
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&__io=940ff91d9.8a31a7f20_1549653848561&1549653848571
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:940ff91d9.8a31a7f20_1549653848561,cdn_version:6]&s=6acc7c777cce3be138a245218c439c54&1549653848574
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=e9f7e30eaec7a49a8083ef2bc5e6e500&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3De9f7e30eaec7a49a8083ef2bc5e6e500%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=e9f7e30eaec7a49a8083ef2bc5e6e500&userId=adscale-user:626331549653848150
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=e9f7e30eaec7a49a8083ef2bc5e6e500&userId=adscale-user:626331549653848150
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.19.33.59 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=e9f7e30eaec7a49a8083ef2bc5e6e500&userId=adscale-user:626331549653848150
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Fri, 08 Feb 2019 19:24:08 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=e9f7e30eaec7a49a8083ef2bc5e6e500
43 B
984 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=e9f7e30eaec7a49a8083ef2bc5e6e500
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.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:10 GMT
AN-X-Request-Uuid
17d730bc-6194-4ba7-bf1a-7d2f4684ccd7
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.108:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

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

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 08 Feb 2019 19:24:08 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
260
x-xss-protection
1; mode=block
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=e9f7e30eaec7a49a8083ef2bc5e6e500
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=e9f7e30eaec7a49a8083ef2bc5e6e500
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 , European Union, 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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
Thu, 07 Feb 2019 19:24:08 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=e9f7e30eaec7a49a8083ef2bc5e6e500
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
333 B
991 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
54.230.93.94 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-93-94.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Via
1.1 a907498188cf5fbb13fb98b2dcde84cd.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:40 GMT
Server
AmazonS3
ETag
"36e7925e19d21a2047551ef140961e54"
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
GGoiLSipaoPuOOCpFpOlQyLzLddVrl-yaXVcxvIJLIFgiGUYg9fPcw==
Expires
0
ads
securepubads.g.doubleclick.net/gampad/
146 KB
26 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3649357497696256&correlator=3046591982102226&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21063144%2C21062377%2C21062456%2C21063161&vrg=2019020401&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&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%2C0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C200x600%7C300x600%7C10x40%7C10x30%7C10x20%2C728x90%7C728x180%7C770x250%7C20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%2C300x250%7C300x601%7C300x125%7C10x20%7C10x10%2C770x251%7C800x251%7C970x251%7C20x10%7C30x10%7C40x10%7C80x10%7C100x10%2C800x450%7C580x500%2C301x250%7C300x126%7C10x10&prev_scp=adslot%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dsky%7Cadslot%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cbb%2Cvidwa%26pc%3D1%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dbanner%7Cadslot%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%26pc%3D1%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Drectangle%7Cadslot%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%26pc%3D1%26yieldlove_meta%3Dpid%253A17296.sb%253Af%26yieldlove_pid%3D17296%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Dbillboard2%7Cadslot%3Dposterad%26af%3Dptad%2Cintxspt%26pc%3D1%7Cadslot%3Drectangle2%26af%3Df1x1%2Cmrec%26pc%3D1%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_placement%3Drectangle2&cust_params=tagm%3Dmt%26flashVersion%3D0%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26adset%3Dbrsl%26flash%3Dno%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound%26mbrid%3De9f7e30eaec7a49a8083ef2bc5e6e500%26mbrseg%3Db3838f1f%252C134dad1c%252C781245b2%252C3e05b94d%252C8be7d6d2%26nuggad%3Dn3-1%252Cn4-0%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%252Cn70-3%252Cn71-1%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&cookie_enabled=1&bc=15&lmt=1549653848&dt=1549653848651&dlt=1549653847494&idt=619&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0%2C0%2C0%2C0%2C0&adys=0%2C0%2C0%2C0%2C0%2C0&adks=2129558987%2C973278271%2C2964933683%2C3798284268%2C3262996680%2C638100629&ucis=1%7C2%7C3%7C4%7C5%7C6&ifi=5&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=194510655078144&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=true&fws=128%2C128%2C128%2C128%2C128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
cafe /
Resource Hash
30bbcc667eb9bffbb14462a7483c5da0a13873b20dfc60187de666b5be5251b3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-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="44,43,39"
content-length
26569
x-xss-protection
1; mode=block
google-lineitem-id
4939913652,4939913652,-1,4890373424,-2,-1
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138258715078,138258455364,-1,138258573988,-2,-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_2019020401.js
securepubads.g.doubleclick.net/gpt/
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
sffe /
Resource Hash
95b19c951f8010a75196c9ef97e9ed4ac0bef10221a0e28f18441a29a5a4552b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 04 Feb 2019 18:27:58 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="44,43,39"
content-length
24161
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:08 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

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

Response headers

sp_bW2P-577022-i_rc.jpg
www.golem.de/9532/adfarm/
68 B
486 B
Image
General
Full URL
https://www.golem.de/9532/adfarm/sp_bW2P-577022-i_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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
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
hd-main.js
hgc-cf-cache-1.svonm.com/
200 KB
54 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=xSPjXGQVtg
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.230.93.94 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-93-94.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
0609b951fd9f92aa5e2c24354a25e9bc1351c05642323dd926fc612b7413baa4

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Fri, 08 Feb 2019 08:54:51 GMT
Server
AmazonS3
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
X-Amz-Cf-Id
10x0-5IaMRTkkaCvnIZ_YjXlD4nmLYOMJBexlr3DMckkEMxK0KucDw==
Via
1.1 a907498188cf5fbb13fb98b2dcde84cd.cloudfront.net (CloudFront)
trial-medrec-m3-140.shtml
www.golem.de/microsite/abo/ Frame F565
498 B
782 B
Document
General
Full URL
https://www.golem.de/microsite/abo/trial-medrec-m3-140.shtml
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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3640f8756f5fc7dafa1151a23255b75d69d383f65164bb039e378ac75d0875f1

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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Server
nginx
Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Type
text/html
Content-Length
498
Last-Modified
Tue, 24 Jan 2017 20:29:40 GMT
Connection
keep-alive
Keep-Alive
timeout=3
ETag
"5887b934-1f2"
X-UPSTREAM
hybrid1.golem.de
Accept-Ranges
bytes
userconnect
ih.adscale.de/
478 B
859 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=8d1441b6-e53b-4380-b7f5-a4ac4d5d5e8b&cbfn=stroeerCoreConnect&ts=1549653848732&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
61d0ad5890c09b5e46ab949757c1c79d134cfe12799be9569f5b47f02b1666b8

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
478
Expires
Fri, 08 Feb 2019 19:24:08 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame ACF6
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=1549653848&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=1549653848419&bpp=31&bdt=924&fdt=329&idt=327&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&correlator=3628514731309&frm=20&pv=2&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=53&mdo=0&mso=0&u_tz=0&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=3998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=1&uci=1.ym0tu0r9htxk&fsb=1&xpc=qSUf37tVJG&p=https%3A//www.golem.de&dtd=366
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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=1549653848&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=1549653848419&bpp=31&bdt=924&fdt=329&idt=327&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&correlator=3628514731309&frm=20&pv=2&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=53&mdo=0&mso=0&u_tz=0&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=3998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=1&uci=1.ym0tu0r9htxk&fsb=1&xpc=qSUf37tVJG&p=https%3A//www.golem.de&dtd=366
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUm_mc1FEPdTeJjEEor77SIkzvqvQlV3p3ls37r2Et6L0cWz0eXYMz7zlzvX
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Fri, 08 Feb 2019 19:24:09 GMT
server
cafe
content-length
19480
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
osd.js
www.googletagservices.com/activeview/js/current/
76 KB
28 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/r20190204/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
a9161d73cd6490abd72bc80bb1812c24ff04501c0cc458fa72a1df2cb96efa5c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1549455546502977"
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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
28297
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:08 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 0D1B
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=1549653848&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=1549653848450&bpp=8&bdt=955&fdt=361&idt=296&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=4719&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=2&uci=2.k9cjnrsesiw9&fsb=1&xpc=bVZ23Xc937&p=https%3A//www.golem.de&dtd=364
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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=1549653848&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=1549653848450&bpp=8&bdt=955&fdt=361&idt=296&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=4719&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=2&uci=2.k9cjnrsesiw9&fsb=1&xpc=bVZ23Xc937&p=https%3A//www.golem.de&dtd=364
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUm_mc1FEPdTeJjEEor77SIkzvqvQlV3p3ls37r2Et6L0cWz0eXYMz7zlzvX
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Fri, 08 Feb 2019 19:24:09 GMT
server
cafe
content-length
18977
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
4 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=430459
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2606:4700:30::6818:6724 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
063cbf4a3405b0c010273a8bf895cc2cadd27abe0792d9d1f0ba0928f786b998
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:08 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
cf-ray
4a60798bb924973e-FRA
status
200
last-modified
Tue, 05 Feb 2019 15:39:25 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
Fri, 08 Feb 2019 20:24:08 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Mon, 11 Mar 2019 19:24:08 GMT
Cookie set map
ih.adscale.de/ Frame D610
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=626331549653848150; tu=4#3991879433#48~e9f7e30eaec7a49a8083ef2bc5e6e500~430459~0~0; ng=2#2166355321#25827564#84086
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Fri, 08 Feb 2019 19:24:08 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 GMT
Content-Length
639
Connection
keep-alive
Set-Cookie
tu=4#2691257501#48~e9f7e30eaec7a49a8083ef2bc5e6e500~430459~0~0#101~~430459~430459~1#38~~430459~430459~1#39~~430459~430459~1#40~~430459~430459~1#72~~430459~430459~1#42~~430459~430459~1#75~~430459~430459~1#63~~430459~430459~1; Domain=ih.adscale.de; Expires=Sun, 10-Mar-2019 19:24:08 GMT; Path=/
nuggad
ih.adscale.de/adscale-ih/ Frame F670
Redirect Chain
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=https%3A%2F%2Fgolem.de%2F&nuggl=https%3A%2F%2Fih.adscale.de%2Fadscale-ih%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYzU5MzQw%2F...
  • https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8...
49 B
489 B
Image
General
Full URL
https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
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.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:09 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Fri, 08 Feb 2019 19:24:09 GMT

Redirect headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Server
Apache
Location
https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/626331549653848150/ts/1549653848742/v/2/hid/431/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2F/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
302 Found
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 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
2.19.33.59 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
ads
googleads.g.doubleclick.net/pagead/ Frame BF8B
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=1549653848&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=1549653848458&bpp=6&bdt=964&fdt=436&idt=288&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=5408&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=3&uci=3.yxt7u1p0k7l4&fsb=1&xpc=wC8K1EYXA0&p=https%3A//www.golem.de&dtd=439
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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=1549653848&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=1549653848458&bpp=6&bdt=964&fdt=436&idt=288&shv=r20190204&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=3628514731309&frm=20&pv=1&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1177571155&ga_fc=1&iag=0&icsg=778042620264192&dssz=54&mdo=0&mso=0&u_tz=0&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=5408&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C410075082%2C410075101&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=3&uci=3.yxt7u1p0k7l4&fsb=1&xpc=wC8K1EYXA0&p=https%3A//www.golem.de&dtd=439
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUm_mc1FEPdTeJjEEor77SIkzvqvQlV3p3ls37r2Et6L0cWz0eXYMz7zlzvX
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Fri, 08 Feb 2019 19:24:09 GMT
server
cafe
content-length
19365
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=940ff91d9.8a31a7f20_1549653848561&1549653848904
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:08 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
/
200 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0609b951fd9f92aa5e2c24354a25e9bc1351c05642323dd926fc612b7413baa4

Request headers

Response headers

Content-Type
text/javascript
spalte_rechts_Abo_3_1b_300x140px.png
www.golem.de/microsite/abo/trial/ Frame F565
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/trial/spalte_rechts_Abo_3_1b_300x140px.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/trial-medrec-m3-140.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
21d3ecf4c3c0d4d6e57d71c8e83bf6d8845d988ef58224ee2047437be34dd14c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/microsite/abo/trial-medrec-m3-140.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/trial-medrec-m3-140.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Last-Modified
Tue, 01 Sep 2015 16:30:03 GMT
Server
nginx
ETag
"55e5d28b-2b4a"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11082
Expires
Mon, 11 Mar 2019 19:24:09 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
235 KB
81 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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
bc5c60270872a90bc01d1f4a3823237d34461878a38fd5adf18c02b3173404b0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 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="44,43,39"
content-length
82346
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:09 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

Response headers

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

Request headers

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

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: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190204/r20190131/show_ads_impl.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:09 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
Mon, 11 Mar 2019 19:24:09 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.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io_lv=1549653848560; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:09 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
Mon, 11 Mar 2019 19:24:09 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame E05F
0
0

Cookie set /
servedby.flashtalking.com/imp/2/103389;3586916;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPBannerxxalwaysonxxxxxxxxx/ Frame D8A4
0
0
Document
General
Full URL
https://servedby.flashtalking.com/imp/2/103389;3586916;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPBannerxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298292&ft_width=728&ft_height=90&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
205.185.216.10 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
map2.hwcdn.net
Software
prod-xre-app1.frk11 /
Resource Hash

Request headers

Host
servedby.flashtalking.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Connection
Keep-Alive
Cache-Control
no-cache, no-store
Content-Length
2696
Content-Type
text/html
Server
prod-xre-app1.frk11
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Set-Cookie
flashtalkingad1="GUID=4056E8323752BA|tp=(545-1791-v-40561924,545-8195-v-40561924,545-9455-v-40561924)";Path=/;Domain=flashtalking.com;Expires=Sun, 07-Feb-21 19:24:09 GMT
Pragma
no-cache
P3P
policyref="/w3c/p3p.xml", CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
X-HW
1549653849.dop013.pa1.t,1549653849.cds009.pa1.shn,1549653849.dop013.pa1.t,1549653849.cds037.pa1.sc,1549653849.cds037.pa1.p
Cookie set /
servedby.flashtalking.com/imp/2/103389;3586917;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPSkyxxalwaysonxxxxxxxxx/ Frame 749B
0
0
Document
General
Full URL
https://servedby.flashtalking.com/imp/2/103389;3586917;201;jsiframe;BusinessAdDE;v0103CPMMittelstandschannelBusinessGiroWPSkyxxalwaysonxxxxxxxxx/?ft_custom=&imageType=gif&ftDestID=22298293&ft_width=200&ft_height=600&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvx4KTmZkRB93VaGJSvWpN3dgT0l-7CmH71O78nkUjtkFNP_QMPPHMSDNdYU-o3imr1btRjpHDApAg6xumkxk5JSiYg1DiIvCzOyYSwgyUE1g-54Qza6s0thgs4vcpm8XghvaJnHVJVG2_ALeiazxODHV2v8I2UK6nzVxKuPv9flkQ1VUOLQC4bhOqSSlCitYHJGyPzXiPbE3aPbmlK37yzFlFObPd5CGBwX9QnpB4kFpbArcfTmMLEnZdR7m5W01iBtOSu96zQdwFI%2526sai%253DAMfl-YSg-35x9vVTN9cqjJ--ZvHPHlEaOP6R9DCYPGWbpm4PKzzE-BXWXAEco0vLzuAKrJT4JjfaBKo-MCbjowqbhn4GTb5L3d0m1g6eVHZiDs3uWza1XABTpjIo2Vo%2526sig%253DCg0ArKJSzHNgD76uoJJREAE%2526urlfix%253D1%2526adurl%253D&ftOBA=1&ftExpTrack=&cachebuster=1319094761
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
205.185.216.10 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
map2.hwcdn.net
Software
prod-xre-app6.frk11 /
Resource Hash

Request headers

Host
servedby.flashtalking.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Connection
Keep-Alive
Cache-Control
no-cache, no-store
Content-Length
2697
Content-Type
text/html
Server
prod-xre-app6.frk11
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Set-Cookie
flashtalkingad1="GUID=4056F84C0A280E|tp=(545-1791-v-40561924,545-8195-v-40561924,545-9455-v-40561924)";Path=/;Domain=flashtalking.com;Expires=Sun, 07-Feb-21 19:24:09 GMT
Pragma
no-cache
P3P
policyref="/w3c/p3p.xml", CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
X-HW
1549653849.dop013.pa1.t,1549653849.cds009.pa1.shn,1549653849.dop013.pa1.t,1549653849.cds037.pa1.sc,1549653849.cds037.pa1.p
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 4C05
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7a9c057de0f641b2b9a094f9f198598b1130ae5e4c92a2fe7bc6a9df1fe5ec3a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1549455546502977"
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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
28846
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:09 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 4C05
0
61 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuZLqiHLaWyXNwkcdBLLaikn15sTR1oQp4ti_wFdv0SzZx8Aq5cqo76dN-y4XljT_4UH8PAoChekbpMggM97O_TXxoUw-BOVhOUpZ-1nBkpdacDcOOBg6S_r-B4hZcp0QBD7EOCm0AfKXrtTyl7Nv7Tg6hOJ775DgjV6yRwb5M8k_3ax7pOa-XgrvtTkdKSFeVfEX2tVtkW6muIiNIs2q4eaGI-ckdw_AG8P53CuSHgzucTCErVUnAvO_h14-wguAe0AV7F-9EBGzfpMUic8OvQ0xfK2oCgT8M4RnTTAu4&sai=AMfl-YTcu6Dv281Yg0Q4y1Gh6WEF2juOwgamlWlrqNFHBNVmeuXyOg_hkQF2HSlY_HAFkTuAziz0U6c6EM0FHb03K-tbqT7dUaaZ9kmiQvS_AOfWRdRoVWWIj3Za6Zw&sig=Cg0ArKJSzN8Du18JNeH-EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
0
x-xss-protection
1; mode=block
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=8044205462
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.10.45 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:10 GMT
Last-Modified
Fri, 08 Feb 2019 18:40:04 GMT
Server
AmazonS3
x-amz-request-id
A2779AD215E7011A
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
qql7DLBGXBNmm7vCMFk+HlHXcj/Ku/uGzXbhMR5VIMRNvdYysA3p/anSdxQN6K6Ow3Os8u+FDxs=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=6895783431
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Fri, 08 Feb 2019 19:24:09 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/ Frame A7C4
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-31/html/container.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
1737
date
Mon, 21 Jan 2019 15:44:22 GMT
expires
Tue, 21 Jan 2020 15:44:22 GMT
last-modified
Thu, 01 Nov 2018 14:23:58 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
1568387
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
gpt.js
www.googletagservices.com/tag/js/ Frame 0498
40 KB
0
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7f4c79ef3b9ad8186e44d5f06491aa0947af98f0e68c07708f900f57a5f2e141
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"77 / 261 of 1000 / last-modified: 1549580749"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
10785
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:07 GMT
pubads_impl_2019020401.js
securepubads.g.doubleclick.net/gpt/ Frame 0498
181 KB
0
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
sffe /
Resource Hash
2f4bdb9f287ec32f91fe0d396715fb99889cf89c5912a4ee8143e5a74410452e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 08 Feb 2019 19:24:07 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 04 Feb 2019 18:27:58 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="44,43,39"
content-length
63439
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:07 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 0498
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
108
x-xss-protection
1; mode=block
ads
securepubads.g.doubleclick.net/gampad/ Frame 0498
329 B
298 B
Script
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1899702628101349&correlator=4022019929479831&output=json_html&callback=googletag.impl.pubads.setPassbackAdContents&impl=s&eid=21061742%2C21063144%2C21063137&vrg=2019020401&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=770x251%7C800x251%7C970x251%7C20x10%7C30x10%7C40x10%7C80x10%7C100x10&scp=adslot%3Dbillboard2%26src%3Dsdg&eri=6&cookie=ID%3D7d858f55e451bd6e%3AT%3D1549653848%3AS%3DALNI_MbR-VLuzBQBJcfgrnGBaysEdU7OBg&cdm=www.golem.de&bc=15&lmt=1549653849&dt=1549653849387&dlt=1549653848716&idt=651&ea=0&frm=23&biw=1585&bih=1200&isw=770&ish=251&oid=3&adk=3767186536&uci=u6lyhn2kwuia&ifi=1&ifk=158203207&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=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=279128799.1549653848&ga_sid=1549653848&ga_hid=1098985837&ga_fc=true&fws=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
cafe /
Resource Hash
85bc560d0c69e06ee6b1bdb1cce58694b6fc19ca7598068158ff7a4de3d3c6d8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
205
x-xss-protection
1; mode=block
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
cache-control
no-cache, must-revalidate
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019020401.js
securepubads.g.doubleclick.net/gpt/ Frame 0498
64 KB
0
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
sffe /
Resource Hash
95b19c951f8010a75196c9ef97e9ed4ac0bef10221a0e28f18441a29a5a4552b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 08 Feb 2019 19:24:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 04 Feb 2019 18:27:58 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="44,43,39"
content-length
24161
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:08 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/ Frame 0498
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

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

Response headers

osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0498
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7a9c057de0f641b2b9a094f9f198598b1130ae5e4c92a2fe7bc6a9df1fe5ec3a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1549455546502977"
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="44,43,39",quic=":443"; ma=2592000; v="44,43,39"
content-length
28846
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:09 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-31/html/ Frame 729D
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-31/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019020401.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-31/html/container.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
1737
date
Mon, 21 Jan 2019 15:44:22 GMT
expires
Tue, 21 Jan 2020 15:44:22 GMT
last-modified
Thu, 01 Nov 2018 14:23:58 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
1568387
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
view
securepubads.g.doubleclick.net/pcs/ Frame 0498
0
61 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstyS7Aozb6hVg13bCeMHZR9jKY8reQxJelgvj7kFFLff1-Wu3L2zMLCTAHPo8GW6qDObxCM5zCKvqc_tbMkb4nPA9m3LK1-ycNGIW1b9nxUlOFXPhHUzwmyg8B0HxfORd1XQRRrD9nrpDXr92-ruPKBu8gV6_VmtQzbUnMly_6YUFzC5llleiyxcJ9r4czdhFgVOwv0yOWdgsbjjEfLvvUANyd3OBryMercJ5-mz0yoqTovX0KGDv3gFxJjhf-WYG2zdG2XVFHyyzaPGcqr&sai=AMfl-YS6B4NQ4PFxVo-YSPj8aCVlywSb3XxWtxfBdHvWr8w1WzB9BOkO8J3LBSC4MLHJPo0Aldq9RVuu6KH018VCFMTWtLL6ljvcfnvhyjvrE24vN7l_LNiee_tuXLM&sig=Cg0ArKJSzKhw6gF6XZ9nEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
216.58.208.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
content-length
0
x-xss-protection
1; mode=block
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
333 B
1000 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=6307809423
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.93.94 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-93-94.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:08 GMT
Via
1.1 a907498188cf5fbb13fb98b2dcde84cd.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
76
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:40 GMT
Server
AmazonS3
ETag
"36e7925e19d21a2047551ef140961e54"
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
vmeMBklJMXw3GgLcS7D3XQqViL0Ai8FUbx464EHTxRi0aQxPE097pg==
Expires
0
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFDHYAAKktFLkqFFlqwF23A52AwwALl1FDK2mFLkqFKlkyB23A52AwwA2qoFx1A05A21Az4A03AzxAyyA4yEjrFnmF3yF0BF/k0FAEmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FLlnFBTkzF8PhGAAZAwSAcAAAAPeRAAAAAAABQnBAPCAAFAAQnBTPraAPAAAFAAQnBTNJgASksFkEjAAAAAAAAAAAAEAAAQnBAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFGA3yA44E5wAMAxzA4yA14A01A1zA20AGAkpFylFj0FAAAAIAy4A12A04A11AKA05Az5A5xAz2A1yAGAihFuuFlyFKA05Az5A5xAz2A1yAKA05Az5A5xAz2A1yA0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFQtjFsD7AUA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:09 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:08 GMT
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFEJYAATkzFoZDAAOA55A55A85B55A58E55A55AEA22Aw4ArPraASksF2Td/IAAAAYLAaBAFAAAPraAAAnMo0F0wFz6BvvAzlFy2FlkFi5FumEshFzoF0hFsrFpuFnuBjvFtvBptFwvByvAxwAzzA45A7zA14A25Ax2A7yAwxA7qEzpFmyFhtFl7BC1FzpFulFzzFBkFEFF72EwxAwzADQFNNFp0F0lFszF0hFukFzjFohFuuFlsFC1FzpFulFzzFHpFyvFXQFChFuuFlyF44FhsF3hF5zFvuF44F44F44F44F4vB/mE0fFj1Fz0FvtF9mAptFhnFlUF5wFl9BnpFmmBm0FElFz0FJEF9yAyyA54Ay5AymAm0Ff3FpkF0oF93Ay4AmmE0fFolFpnFo0F95AwmAjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFrlBy1AzGE4hFplBy1AzEEBLFBPFqzF24F0LEUtFarFSCF5zAWhFHKFT2FXwFOzBknFUwBstB3DEtIF3xAP3B4uErVFq0FrGFOQFfRFNQFQIFNTFEOFkZFVtBvzBptFyxBi0FSqFwIFEBFwBFn2B41FtrF4rF1KETpFZnFxEEpJF2DF6PF5ZFT3Fn5FVFFxnEt1A0RE6hF2zEw0EonFz0B2jFwtF4YEnoF2hFKuFIWFKWFHyBfBFMlFphF64FPEFIWFy2E4JEyVEL2Bu6FW4FL1FQ2F5mEsrFRxBWVFPMFRDF0iEoPFxTFTsFDpF0ZFIKFH5FQ6FYpFQiFFzBhQFitFsLFz3A56FGsFGPFiQFk1BDHFC3FY5BRuFwCF0rEGwFiBFyjFmUFtNFMFFuaFkSF3tE1XEwxApCF0PFT1F52A6RFk3FGJFlyA1yA2zEhpFlyA1zAEBFNmFstBZTFntBz1A45B2WFUOF5jExqFKtBtaE2IFQIFsFFhPFQ2BS5BEDFZQFHXFiwFt0BQLF66FFtBCYFXYFBFFjvFw2EM6F1BFLyFKUF0KEqmFhCFLvFtNEDiFqvF3xFioFu0BHUFi1BMzBkwBtxBn2BlWFIaFpEFzzB1XF6hFxYEBCFUwFqJFvyBWvFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FIOFnEF32A1vFKKFSFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEmmE0PFCBF9xAmmE0FF4wFUyFhjFr9BmjEhjFolFi1Fz0FlyF9xAzxA5wA50A32AxBEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFbvthWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:09 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:08 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, 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

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

Response headers

status
200
date
Fri, 08 Feb 2019 19:28:10 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
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, 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

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

Response headers

status
200
date
Fri, 08 Feb 2019 19:28:10 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
/
ssl.3.damoh.golem.de/a64170e53bfb225963dd055fcad1d7bd8b25b42a/
333 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.golem.de/a64170e53bfb225963dd055fcad1d7bd8b25b42a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.131.55 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.55.131.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
87
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 08 Feb 2019 19:24:11 GMT
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:41 GMT
Server
AmazonS3
Etag
"36e7925e19d21a2047551ef140961e54"
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-5
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
bridge3.277.1_de.html
imasdk.googleapis.com/js/core/ Frame 036A
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.277.1_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.277.1_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
180143
date
Wed, 06 Feb 2019 22:09:02 GMT
expires
Thu, 06 Feb 2020 22:09:02 GMT
last-modified
Wed, 06 Feb 2019 22:02:02 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
162907
alt-svc
quic=":443"; ma=2592000; v="44,43,39"
client.js
s0.2mdn.net/instream/video/
26 KB
11 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.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4016:80d::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:09 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="44,43,39"
content-length
10523
x-xss-protection
1; mode=block
expires
Fri, 08 Feb 2019 19:24:09 GMT
truncated
/ Frame 0498
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8486c82ce9787d7bb2a032e5de11bf76cd2ab8be3032f2f294e9999bb89f4a4c

Request headers

Response headers

Content-Type
image/png
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFFScAAUkzFRCZDAAOA55A55A85B55A58E55A55AEA22Aw4ArNJgAPAAA+95AAAjPraAPAAAAAAAAATPraAPAAA+95AAAjNJgAPAAAAAAAAATNJgAPAAAFAAQnBT+95APTBA/IAAAAHPraAPBAAXUAAAAHNJgASksFCVdXUAAAAIDAYJAFAAANJgAAAlMo0F0wFz6BvvAzlFy2FlkFi5FumEshFzoF0hFsrFpuFnuBjvFtvBptFwvByvAxwAzzA45A7zA14A25Ax3A7yAwxA7qEzpFmyFhtFl7BC1FzpFulFzzFBkFEFF72EwxAwzADQFNNFp0F0lFszF0hFukFzjFohFuuFlsFC1FzpFulFzzFHpFyvFXQFTrF54F4hFs3Fh5FzvFu4F44F44F44F44Fv/Am0FfjF1zF0vFt9BmpEthFnlFU5FwlF9nEpmFmmE0EFlzF0JFE9ByyAy5A4yA5zAmmE0fF3pFk0Fo9BywAwmAm0FfoFlpFnoF09B2wAwmAjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFrlBy1AzGE4hFplBy1AzEEBLFBPFqzF24F0LEUtFarFSCF5zAWhFHKFT2FXwFOzBknFUwBstB3DEtIF3xAP3B4uErVFq0FrGFOQFfRFNQFQIFNTFEOFkZFVtBvzBptFyxBi0FSqFwIFEBFwBFn2B41FtrF4rF1KETpFZnFxEEpJF2DF6PF5ZFT3Fn5FVFFxnEt1A0RE6hF2zEw0EonFz0B2jFwtF4YEnoF2hFKuFIWFKWFHyBfBFMlFphF64FPEFIWFy2E4JEyVEL2Bu6FW4FL1FQ2F5mEsrFRxBWVFPMFRDF0iEoPFxTFTsFDpF0ZFIKFH5FQ6FYpFQiFFzBhQFitFsLFz3A56FGsFGPFiQFk1BDHFC3FY5BRuFwCF0rEGwFiBFyjFmUFtNFMFFuaFkSF3tE1XEwxApCF0PFT1F52A6RFk3FGJFlyA1yA2zEhpFlyA1zAEBFNmFstBZTFntBz1A45B2WFUOF5jExqFKtBtaE2IFQIFsFFhPFQ2BS5BEDFZQFHXFiwFt0BQLF66FFtBCYFXYFBFFjvFw2EM6F1BFLyFKUF0KEqmFhCFLvFtNEDiFqvF3xFioFu0BHUFi1BMzBkwBtxBn2BlWFIaFpEFzzB1XF6hFxYEBCFUwFqJFvyBWvFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FIOFnEF32A1vFKKFSFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEmmE0PFCBF9xAmmE0FF4wFUyFhjFr9BmjEhjFolFi1Fz0FlyF9xAzxA5wA50A32AxBEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd/IAAAAgOAYJAFAAA+95AOAxwA5yA2zAfxBzxA22AxfEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFtnzwXA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:09 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:08 GMT
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFGA1AA/k0FKImvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FLlnFCUkzFYBPzCAAAAAAABduzAPBAAFAAduzTbosAZBAAOA55A55A85B55A58E55A55AGAyxAx4A25ArbosAP5BAYGAUTAHbosASksFwFjAAAAAAAAAAAAEAAAduzAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA14A13Az5A44AGAkpFylFj0FAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AKAipFssFivFhyFkyBKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdYGAUTACMA7DAFAAAbosAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFd6MNWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:11 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:10 GMT
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFHB1AA/k0FDMmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0BFLlnFDTkzFeP0WAAAAAAABJsxAPAAAFAAJsxT1ZoASksFSEjAAAAAAAAAAAAEAAAJsxAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFKAylFj0FhuFnsFlyBEAu1FssFEAu1FssF4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBQtjF5uu+XA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:11 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:10 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 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,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.0.183 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.183.0.251.148.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1; __gads=ID=7d858f55e451bd6e:T=1549653848:S=ALNI_MbR-VLuzBQBJcfgrnGBaysEdU7OBg
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 08 Feb 2019 19:24:11 GMT
Last-Modified
Fri, 10 Aug 2018 12:19:04 GMT
Server
openresty/1.13.6.2
ETag
"5b6d82b8-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 76A1
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
472999f69982a9d8f7e3961d221a923e14005658bd802d43b1741a8c6ae03ddd

Request headers

Response headers

Content-Type
text/javascript
/
ssl.3.damoh.golem.de/f0f311700cc43cbf042dc467a06b572684b096cb/
110 B
672 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/f0f311700cc43cbf042dc467a06b572684b096cb/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllWm9va2VpRWVwaGVUaGk9aWVab29rZWlFZXBoZVRoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3guQWV8fCh4LkFlPTApO3guQWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5BZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5OYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuZmgobSksYS5zZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5SYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wub2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5wZChjKTthLkN1KGwpO2EuQnUobSk7YS5vdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRtPXRoaXMuYVs3XTt0aGlzLlV1PQp0aGlzLmFbMl07dGhpcy5RdD10aGlzLmFbM107dGhpcy5xbD10aGlzLmFbN107dGhpcy5hbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs2XX1jLkNpPWI7Yi5wcm90b3R5cGU9e3NtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG06dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdTp0aGlzLlB0KGEpfSxQdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF0OnRoaXMucGwoYSl9LHBsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xbDp0aGlzLiRtKGEpfSwkbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkNpfHxrYSxYYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5zbSg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89ITE7dGhpcy5KYT0ic2V0dXAiO3RoaXMudWM9W107dGhpcy5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmd1LmJpbmQodGhpcykpfWMuUWo9YjtiLnByb3RvdHlwZT17SmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sSm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCmphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxndTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5mdShhLmRhdGEpfSxmdTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxPZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuRWcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxLcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sSG46ZnVuY3Rpb24oYSxiKXtpZihiKXtpZihhPT1iKXtpZihlLndxKGEpKXJldHVybjsoYj10aGlzLk5mKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sd3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sWWY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sSGE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxmZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sbGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sd2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sa2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGUoYSl9LmJpbmQodGhpcyksMTAwKX0sCnBiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGthOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxmZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0saWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7CnJldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdixxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1KO3Y9aztxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4mbHx+biZ2KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZsfG4mdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCwKbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedikrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1O2s9ayt2JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoSikrYihrKStiKG0pKS50b0xvd2VyQ2FzZSgpfSxoYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHUsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxjPWEuY2hhckNvZGVBdChrKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxRZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5vPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLG09KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPQptO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuUWYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtjaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxCaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxwcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKU206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2koKXx8YS5CaSgpfHxhLnByKCl8fGEud2woKXx8YS5TbSgpfX07cmV0dXJuIGEuSG8oKX0sQ2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT0KYVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxrZzpmdW5jdGlvbihhKXthPXRoaXMuQ2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxuYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0KITApO3JldHVybiBkfSxDcDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxYdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54aChiKSsiOiIrdGhpcy54aChNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKToKYS50b1N0cmluZygpfSxPZTpmdW5jdGlvbihhKXt0aGlzLkphPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkphOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxlYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5ZYyhiLGQpKTtiJiYoaD1rLlljKGEsYikpO2YmJihoPWsuWWMoaCxmKSk7YyYmKGg9ay5ZYyhoLGMpKTtlLmVjKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy52Y3x8KHRoaXMudmM9e30pO3RoaXMudmNbZl18fCh0aGlzLnZjW2ZdPTApO3RoaXMudmNbZl0rKzsxMDx0aGlzLnZjW2ZdfHwoZj1sLktlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLklhKGYsITApLGY9bC5JYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx0ZTpmdW5jdGlvbigpe2wmJmwuYWE/bC5pc0VuYWJsZWQmJmwuaXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoKX0uYmluZCh0aGlzKSw1MDApfSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT8KdGhpcy5iZChhKToiIn0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIubmUoYSl8fHRoaXMuVXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmRoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuWWYoYSkpcmV0dXJuIHRoaXMuWWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpOwpmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk5hKGEsYi56YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5lZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5IbihjLGEpO3JldHVybiBjfSxOYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHUpe3ZhciBrPWh8fGw7aD0hMDt1JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTsKZWxzZXtrLklhKGEsaCk7aD1rLklhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5LYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxFZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJgoyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sdnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMudWMpZm9yKHZhciBjIGluIHRoaXMudWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy51Y1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuaGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOgpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sRmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5OYShhLGYuemEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnZzKGYuZWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVjPWF9LFN3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5OYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpOwpkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxLbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFFyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLlFqfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5veD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlBqPWI7Yi5ZYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuTHQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnlmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLnJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi52Zj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi56Zj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IueW49e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnRmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYnc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1zPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm5xPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Jdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5LZj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnVwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuU2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5SYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IueGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkJuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5GYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuS2Q9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuTWQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5Bbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuRmg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnloPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5MZj17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuRHc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLApuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuT3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLlBqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJxPXRoaXMuYVs1XTt0aGlzLnlrPXRoaXMuYVsxMF07dGhpcy5Xaj10aGlzLmFbOV07dGhpcy5kaz10aGlzLmFbN107dGhpcy5BbT10aGlzLmFbOV07dGhpcy5Wdj10aGlzLmFbOV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs2XX1jLnpvPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuYnE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlrOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Xajp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGs6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFtOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wdjp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR3A6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGxhPWMuem98fGxhLFljPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpZYy5hcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLlJqPWI7Yi5wcm90b3R5cGU9e2ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxpYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sTnE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFpjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5aYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlpjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sbWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mZSh0aGlzLmliKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuWmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxMcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jKCkrIjIifSx1ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmZlKHRoaXMuTnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5aYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5Sanx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5nbj10aGlzLmFbOF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOF19Yy5hbz1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZ246dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIG1hPWMuYW98fG1hLFpjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmY/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5mZj1ifSkoYyk7dmFyIEs9Yy5mZnx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbz10aGlzLmFbNV07dGhpcy5wbT10aGlzLmFbN107dGhpcy54aj10aGlzLmFbOF07dGhpcy5LcD10aGlzLmFbMV07dGhpcy4kaj10aGlzLmFbNF07dGhpcy5Lcz10aGlzLmFbNV07dGhpcy5Icz10aGlzLmFbNl07dGhpcy5naj10aGlzLmFbNF07dGhpcy50bj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs5XX1jLkVwPWI7Yi5wcm90b3R5cGU9e0xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbzp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnBtOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54ajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3A6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRqOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lczp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHM6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdqOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIG5hPWMuRXB8fG5hLCRjPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQokYy5Mbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLklsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRGE9e307dGhpcy5GPW51bGw7dGhpcy5yYz0xMDA7dGhpcy5xYj0wO3RoaXMuQmE9MTUwO3RoaXMudWI9MDt0aGlzLkR1KGIpfSxjOmZ1bmN0aW9uKCl7fSxKOmZ1bmN0aW9uKCl7dGhpcy5xYjw9dGhpcy5CYT8odGhpcy5xYisrLHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpOjA+dGhpcy5CYSYmKHRoaXMudWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5yYykpfSxxdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFiPnRoaXMuQmE/ITA6ITF9LE1lOmZ1bmN0aW9uKCl7dGhpcy5xYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRHU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sTDpmdW5jdGlvbihiKXt0aGlzLkRhW2IuaWIoKV09YjtMJiYKTC5DZyYmTC5ldihiKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5IYSh0aGlzLkRhKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9Yi55YSgpO2Zvcih2YXIgYSBpbiB0aGlzLkRhKWlmKGIuaWQ9PXRoaXMuRGFbYV0ueWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sS3g6ZnVuY3Rpb24oYil7dGhpcy5EYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5JbHx8cjsoZnVuY3Rpb24oYyl7Yy5LbD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLnJjPTEwO3RoaXMucWI9MDt0aGlzLkJhPTUwO3RoaXMuSz1udWxsO3RoaXMubGE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmtiPSIiO3RoaXMuU2Y9ITE7dGhpcy5NKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMueWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sZmE6ZnVuY3Rpb24oKXt9LE11OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LEd1OmZ1bmN0aW9uKGIpe3RoaXMueGU9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54ZX0sd2U6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXt0aGlzLnFiPD10aGlzLkJhJiYodGhpcy5xYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMucmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9LGVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFU6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMua3IoKXx8dGhpcy5FbigpO3RoaXMuUGUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKeHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sRW46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUua2EoMTApKX0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0seWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sZmQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5sYT0KITB9LEliOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxxZTpmdW5jdGlvbigpe3JldHVybiExfSxnaDpmdW5jdGlvbihiKXt0aGlzLmtiPWJ9LHR4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2J9LGFoOmZ1bmN0aW9uKCl7dGhpcy5rYj1udWxsfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMua2ImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5TZj0hMCl9LGdjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHF4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLktsfHxwOyhmdW5jdGlvbihjKXtjLkxoPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLnBmPSIxIjt0aGlzLnFmPSIyIjt0aGlzLnFuPSIzIjt0aGlzLnpjPTA7dGhpcy5JZz0zMDt0aGlzLnpiPVtdO3RoaXMuUmE9W107dGhpcy5TYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5BZj10aGlzLkJoPSExO3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pZD1lLmthKDEwKTt0aGlzLnBkKGIpO3RoaXMuRXUoYSl9LGM6ZnVuY3Rpb24oKXt9LGdhOmZ1bmN0aW9uKCl7dGhpcy5CaHx8KHRoaXMuQmg9ITAsZS50ZSgpKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLkViJiYhb2EmJihvYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxDOmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMuSnUoKSx0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSwKZyksdGhpcy50aCgpLHRoaXMuQWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnpiLnB1c2goYiksdGhpcy5SYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnpiJiYwPHRoaXMuemIubGVuZ3RoJiYodGhpcy56Yj1lLnVuaXF1ZSh0aGlzLnpiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy56Yi5qb2luKCIsIikpKTtpZih0aGlzLlJhKXtmb3IodmFyIGc9MDtnPHRoaXMuUmEubGVuZ3RoO2crKyl0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXT09dGhpcy5TYltiXSYmYS5wdXNoKHRoaXMuUmFbZ10uZGV0YWlsKSx0aGlzLlNiW3RoaXMuUmFbZ10ucmVhc29uXTx0aGlzLlNiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLGI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuU2JbYl18fChiPSJ1bmtub3duIixhPVtdKTsKMDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0seXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucGZ9LEp1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xZn0sS3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnFufSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemN9LHNmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLnBmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5xZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuemN9LHBkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXU6ZnVuY3Rpb24oYil7dGhpcy5GPWJ9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sCnlzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5MaHx8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xcz10aGlzLmFbOV07dGhpcy5abT10aGlzLmFbMl07dGhpcy5Tcz10aGlzLmFbOF07dGhpcy5VbT10aGlzLmFbNF07dGhpcy5ncz10aGlzLmFbOV07dGhpcy5ndD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsxXX1jLmhxPWI7Yi5wcm90b3R5cGU9e3BzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5ZbShhKX0sWW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlptOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tczp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZ3Q6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYT1jLmhxfHxwYSxhZD1uZXcgcGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5wcyg0KTsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5hYihiKX0uYmluZCh0aGlzKSl9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5LJiZ0aGlzLksoKX0sTzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgVD1jLklpfHxUOyhmdW5jdGlvbihjKXtjLkhpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5DZD1udWxsO3RoaXMubHc9MUUzO3RoaXMuU2c9bnVsbDt0aGlzLkR2PTJFM30sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5ObyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLnNxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5nci5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLmZyKGEsYil9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMucHcoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLnF3KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLnNwKGEpfS5iaW5kKHRoaXMpKX0sc3A6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMuQygpfSxwdzpmdW5jdGlvbihiKXt0aGlzLkNkfHwodGhpcy5DZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucncoYil9LmJpbmQodGhpcyksdGhpcy5sdykpfSxydzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZCk7dGhpcy5DKCl9LHF3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNkKX0sZXI6ZnVuY3Rpb24oYil7dGhpcy5seChiKTsKdGhpcy5TZz1uZXcgRGF0ZTt0aGlzLlNnLXRoaXMuYXU8dGhpcy5Edj90aGlzLkMoKTp0aGlzLnMoKX0sZ3I6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5wZChuZXcgVChhKSkpO3RoaXMuQygpfSxzcTpmdW5jdGlvbigpe30sZnI6ZnVuY3Rpb24oKXt0aGlzLmF1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIHFhPWMuSGl8fHFhOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuSGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBxYShnLHRoaXMuRikpLmMoKSl9fXRoaXMuSigpfX19KX0pKGMpOwp2YXIgcmE9Yy5KaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVs2XTt0aGlzLnh2PXRoaXMuYVs5XTt0aGlzLkl0PXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs4XTt0aGlzLmlvPXRoaXMuYVs1XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLlFpPXRoaXMuYVszXTt0aGlzLm1zPXRoaXMuYVs4XTt0aGlzLnN0PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzddfWMua3Q9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm9vOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHY6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkl0OnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vcDp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmlvOnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybTp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWk6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1zOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHRhPWMua3R8fHRhLGJkPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLnFrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuRmI9ITE7dGhpcy5YZigpO3RoaXMuWmYoKTt0aGlzLnRwPSExfSxYZjpmdW5jdGlvbigpe3RoaXMuRmI9CiExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5GYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5UKGIpfSxaZjpmdW5jdGlvbigpe2lmKCF0aGlzLkZiKXt2YXIgYj10aGlzLnlhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5GYj0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLnNkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5zZChhKX0uYmluZCh0aGlzKSl9LHNkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7CmEuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMueGUmJigwLHRoaXMueGUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSwkYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB1YT1jLnFrfHx1YTsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxNOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuemM7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExfSxjOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5CYz0hMTt0aGlzLkxkPTE7dGhpcy5EYz1bXTt0aGlzLmZiPSExO3RoaXMuZ2V0UGxheWVyKCk7CnZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5MZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuZmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmZiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmZiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mYj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLkJjPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLnplKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5JZyYmCiF0aGlzLmhhKCkmJih0aGlzLmZiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5yYigpLHRoaXMuZ2V0UGxheWVyKCkudHA9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmtiO2EmJihhLkJlKCksYS5WZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5CYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpOwp0aGlzLnplKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLklnJiYhdGhpcy5oYSgpJiYodGhpcy5mYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuRGMuaW5kZXhPZihhKSYmCnRoaXMuRGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5nYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMucygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLkRjLmxlbmd0aD49dGhpcy5MZCYmdGhpcy51KCkpfSx5czpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LHU6ZnVuY3Rpb24oYil7Yj90aGlzLlpkP3RoaXMuWmQrKzp0aGlzLlpkPTE6dGhpcy5ZZD90aGlzLllkKys6dGhpcy5ZZD0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5saChhLnZpZGVvVGFnKT9hLkZiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuQmN8fHRoaXMuaXNQbGF5aW5nPwoodGhpcy5ZZD50aGlzLlpkJiYoYj0hMSksdGhpcy5DKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEuWGYoKSxhLlpmKCksYS5GYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciB2YT1jLnBrfHx2YTsoZnVuY3Rpb24oYyl7Yy5yaz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLklxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgdWEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMuUnIoZyl8fCh0aGlzLkwoZyksZz1uZXcgdmEoZyx0aGlzLkYpLGcuTSgpLGcuYygpKX19dGhpcy5KKCl9fSxzeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSwKSXE6ZnVuY3Rpb24oKXt2YXIgYj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLmhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB3YT1jLnJrfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuaXQ9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzRdO3RoaXMuUnc9dGhpcy5hWzJdO3RoaXMuanE9dGhpcy5hWzFdO3RoaXMuUHU9dGhpcy5hWzFdO3RoaXMuZmw9dGhpcy5hWzRdO3RoaXMueHU9dGhpcy5hWzEwXTt0aGlzLmJpPXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzVdfWMuanQ9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRpOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pdDp0aGlzLlVoKGEpfSxVaDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlZoOnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HbDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmpxOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh1OnRoaXMuYWkoYSl9LGFpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5iaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIHlhPWMuanR8fHlhLGNkPW5ldyB5YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpjZC5aaSg0KTsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLlQoYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVShiKTp0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpOwp2YXIgemE9Yy5XbXx8emE7KGZ1bmN0aW9uKGMpe2MuVm09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQWE9Yy5WbXx8QWE7KGZ1bmN0aW9uKGMpe2MuWG09ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJgowPGUuSGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IHphKGcpLHRoaXMuSShnKXx8KHRoaXMuTChnKSwobmV3IEFhKGcsdGhpcy5GKSkuYygpKTtlbHNle3RoaXMuSigpO3JldHVybn19fXRoaXMuSigpfX0pfSkoYyk7dmFyIEJhPWMuWG18fEJhLENhPW5ldyBCYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jcj10aGlzLmFbOV07dGhpcy5Idz10aGlzLmFbMTBdO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMuTnY9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5NdD1iO2IucHJvdG90eXBlPQp7YnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNyOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Idzp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVpOnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbjp0aGlzLk12KGEpfSxNdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk52OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgRGE9Yy5NdHx8RGEsZGQ9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuYnIoNCk7KGZ1bmN0aW9uKGMpe2MuSm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlQoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLmFiKGIpfS5iaW5kKHRoaXMpKX0sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LGZkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LGVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSwkYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChnKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgRWE9Yy5KbXx8RWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5wYT10aGlzLmxjPXRoaXMuWGE9dGhpcy5KYz0hMTt0aGlzLllnPWUucGIoMTApO3RoaXMuQWg9ITA7dGhpcy5RZD10aGlzLnJnPSExO3RoaXMuTmcoKTt0aGlzLmZwKCk7dGhpcy5MYSgpfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLlAsIjsiLHR5cGVvZiBiLlAsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5QP2IuUC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEud2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLlA/Yi5QLndhOiJ1bmRlZmluZWRYIiwKIjsiLGIuUD90eXBlb2YgYi5QLndhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS53YT9iLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLndhP3R5cGVvZiBiLmltYS53YSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLlAmJmIuUC53YT9iLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLGIuUCYmYi5QLndhP3R5cGVvZiBiLlAud2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLkhkOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuSGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5JZDoidW5kZWZpbmVkWCIsIjsiLGIuUD90eXBlb2YgYi5QLklkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLlA/Yi5QLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5QP3R5cGVvZiBiLlAuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5QP2IuUC5QZDoKInVuZGVmaW5lZFgiLCI7IixiLlA/dHlwZW9mIGIuUC5QZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLllnKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Epe3ZhciBiPXRoaXMuamIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnNhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnNhPQpiLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5zYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5zYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5zYX0saGc6ZnVuY3Rpb24oKXtpZighdGhpcy5sYyl7dmFyIGI9dGhpcy5qYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmxjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5sYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmxjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLnFnKXt2YXIgYj10aGlzLmpiKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5xZz0hMCl9cmV0dXJuIHRoaXMucWd9LE5yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuSmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkpjPSEwKTtyZXR1cm4gdGhpcy5KY30sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiRjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksCjIwKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO3ZhciBiPXRoaXMuaGcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIiwKdGhpcy5WKTt0aGlzLlooITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5YYj0hMDtpZihlLm5iKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuWGI9ITA7ZS5uYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLlhifHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5aKCksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLAoyMCl9LHJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5NZiYmYi5hZHMmJih0aGlzLk1mPWIuYWRzKTtyZXR1cm4gdGhpcy5NZn0sZnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLlooKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5aKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuemUoKX0uYmluZCh0aGlzKSl9LFBmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5oZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoKX0uYmluZCh0aGlzKSw1MCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlByKCkpe3ZhciBhPXRoaXMuamIoKSxnPXRoaXMuJGMoKTthJiZnJiYodGhpcy5qYigpLHRoaXMuJGMoKSx0aGlzLlFkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWQ/dGhpcy5zKCk6KHRoaXMuWighMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuamIoKX1lbHNlIHRoaXMucmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5qYigpLGI9dGhpcy4kYygpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWigpKToodGhpcy5aKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5yZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGdwOmZ1bmN0aW9uKCl7dGhpcy5iY3x8KHRoaXMuYmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmJjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuYmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmJjKXt0aGlzLnMoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuYmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdwKCl9LmJpbmQodGhpcyksMTApfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuQWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMuQWgsZnVuY3Rpb24oKXt0aGlzLlBmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy5DeHx8KDEwPHRoaXMubnc/KHRoaXMubygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlouYmluZCh0aGlzKSw1MDApKToodGhpcy5udysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnB1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxwKCl9LmJpbmQodGhpcyksNTApKSl9LHB1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm93KXt0aGlzLm93PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWi5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBGYT1jLkltfHxGYTsoZnVuY3Rpb24oYyl7Yy5LbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1oKGJbZ10pfWNhdGNoKGQpe310aGlzLkooKX19LG1oOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuSGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRWEoYltnXSksYS5sYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBGYShhLHRoaXMuRikpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxKOmZ1bmN0aW9uKCl7dGhpcy51Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnJjKX19KX0pKGMpOwp2YXIgR2E9Yy5LbXx8R2EsSGE9bmV3IEdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp2PXRoaXMuYVsxMF07dGhpcy5jbj10aGlzLmFbMl07dGhpcy5rdz10aGlzLmFbOF07dGhpcy5Fcj10aGlzLmFbNF07dGhpcy5VdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs5XX1jLkJrPWI7Yi5wcm90b3R5cGU9e3l2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuenY6dGhpcy5ibihhKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNuOnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdzp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXI6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTsKdmFyIElhPWMuQmt8fElhLGVkPW5ldyBJYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLnl2KDQpOyhmdW5jdGlvbihjKXtjLmxtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTtiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuVChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe30sYWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmCiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5LKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6Yi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxlYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsCmE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBKYT1jLmxtfHxKYTsoZnVuY3Rpb24oYyl7Yy5rbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5QYj0hMTt0aGlzLiRnKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPWIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuUGI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpOwpiLmdldFBsYXllcigpO3RoaXMuT2MoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5IZigpOnRoaXMucygpfSxPYzpmdW5jdGlvbihiKXtpZighdGhpcy5oYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTthLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMucygpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5QYj0hMCx0aGlzLnMoKTt0aGlzLm8oImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTsKYS5nZXRQbGF5ZXIoKTt0aGlzLlBiP3RoaXMuZ2EoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5DKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5DKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2MoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2MuYmluZCh0aGlzKSwxMDApfX0sSGY6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYKKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkRiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkRiJiYodGhpcy5EYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGJ8fCh0aGlzLm8oImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMuQygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhmLmJpbmQodGhpcyksNTApfX0sJGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJgpiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuUGI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLnMoKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEthPWMua218fEthOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiYKdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgSmEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEthKGIsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBMYT1jLm1tfHxMYSxNYT1uZXcgTGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuV2k9dGhpcy5hWzhdO3RoaXMuSm89dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNF19Yy5Xbj1iO2IucHJvdG90eXBlPXtuczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3M6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBOYT1jLldufHxOYSxmZD1uZXcgTmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1mZC5ucyg0KTsoZnVuY3Rpb24oYyl7Yy5pbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5UKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlUoYil9LGFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmCmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sTzpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LCRhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBPYT1jLmltfHxPYTsoZnVuY3Rpb24oYyl7Yy5obT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkdmKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnpufHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmIub24oIlZpZGVvUGxheWVyOjpBRF9USElSRF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmRyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZHI6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5QYj0hMCx0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMuQygpfSxHZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuYWRzJiZiLmFkcy5pc0FkUGxheWluZyYmYi5hZHMuaXNBZFBsYXlpbmcoKT8odGhpcy56bj0hMCx0aGlzLnMoKSk6dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkdmLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFBhPWMuaG18fFBhOyhmdW5jdGlvbihjKXtjLmptPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWxsUGxheWVycylmb3IodmFyIGI9Yi5nZXRBbGxQbGF5ZXJzKCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgT2EoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgUGEoZyx0aGlzLkYpKS5jKCkpfX1lbHNlIHRoaXMuTWUoKSx0aGlzLkooKX19KX0pKGMpO3ZhciBRYT1jLmptfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHc9dGhpcy5hWzhdO3RoaXMuZXA9dGhpcy5hWzRdO3RoaXMuenU9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuVm49dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMuSXA9dGhpcy5hWzhdO3RoaXMuYnA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuYWo9YjtiLnByb3RvdHlwZT17Y3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5kdzp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56dTp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51aTp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm46dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5qOnRoaXMuSHAoYSl9LEhwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JcDp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBTYT1jLmFqfHxTYSxnZD1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Z2QuY3coNCk7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5NZz1hfSxNOmZ1bmN0aW9uKCl7fSx1ZTpmdW5jdGlvbihiKXt0aGlzLk1nPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1nKS5wYXJlbnROb2RlO3RoaXMuVChiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJDRmxhc2hPbmx5In19KX0pKGMpO3ZhciBUYT1jLmtpfHxUYTsoZnVuY3Rpb24oYyl7Yy5qaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEsZyl7dGhpcy5leHBlcmllbmNlPWc7dGhpcy5pKGIsYSl9LHVlOmZ1bmN0aW9uKGIpe3RoaXMuZXhwZXJpZW5jZT0KYn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5DKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihCQ0FkdmVydGlzaW5nRXZlbnQuQURfUFJPR1JFU1MsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVWE9Yy5qaXx8VWE7KGZ1bmN0aW9uKGMpe2MubGk9CnIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFRhKGQsYSksdGhpcy5JKGQpfHwoZC51ZShhKSx0aGlzLkwoZCksZD1uZXcgVWEoZCx0aGlzLkYsZyksZC51ZShnKSxkLmMoKSk7ZWxzZXt0aGlzLkooKTtyZXR1cm59fX10aGlzLkooKX19KX0pKGMpO3ZhciBWYT1jLmxpfHxWYSxXYT1uZXcgVmEoaWEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy54bj10aGlzLmFbMV07dGhpcy5paT10aGlzLmFbNl07dGhpcy54cj10aGlzLmFbOF07dGhpcy5aaD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXt3bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5paTp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhyOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5aaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhhPWMuVGx8fFhhLGhkPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWhkLnduKDQpOyhmdW5jdGlvbihjKXtjLllrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5UKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFlhPWMuWWt8fFlhOyhmdW5jdGlvbihjKXtjLlhrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLkNjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5DYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5DYygpfSxDYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTsKdmFyIFphPWMuWGt8fFphOyhmdW5jdGlvbihjKXtjLlprPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgWWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgJGE9Yy5aa3x8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNuPXRoaXMuYVs4XTt0aGlzLkRzPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5zaT10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMubXQ9dGhpcy5hWzEwXTt0aGlzLk1uPXRoaXMuYVsxXTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLll3PQp0aGlzLmFbOF07dGhpcy5TaD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVs1XX1jLm5tPWI7Yi5wcm90b3R5cGU9e1JuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU246dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eczp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5yaShhKX0scmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNpOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Oazp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXQ6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5waTp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWXc6dGhpcy5SaChhKX0sUmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5TaDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJiPWMubm18fGJiLGlkPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWlkLlJuKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMuQ2U9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmlhKCk7cmV0dXJufXRoaXMuVChhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVShiKTp0aGlzLmlhKCl9LGJ1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMua2IsZz10aGlzLmliKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkViJiYoMDw9Zy5pbmRleE9mKGQpfHxhLkJlKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5DZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LCRhOmZ1bmN0aW9uKCl7dGhpcy5DZSsrO2lmKDEwPHRoaXMuQ2UpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTsKcmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZmE6ZnVuY3Rpb24oKXt9LGFiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSyYmdGhpcy5LKCl9fSl9KShjKTt2YXIgY2I9Yy5BbHx8Y2I7KGZ1bmN0aW9uKGMpe2Muemw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWGE6ZnVuY3Rpb24oKXtpZighdGhpcy5hZSlpZih0aGlzLmxifHwKKHRoaXMubGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5sYisrLDE1PHRoaXMubGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5hZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoKX0uYmluZCh0aGlzKSwxMCl9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuWGEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMucXE/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVik7dGhpcy51KCl9LmJpbmQodGhpcykpLHRoaXMucXE9ITAsd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5idShhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkMoYil9fSl9KShjKTt2YXIgZGI9Yy56bHx8ZGI7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5CYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aDtiKyspe3ZhciBhPW5ldyBjYih3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcltiXSk7CmEubGF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IGRiKGEsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBlYj1jLkJsfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbM119Yy52dD1iO2IucHJvdG90eXBlPXtOcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3A6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBnYj1jLnZ0fHxnYixqZD1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1qZC5OcCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlQoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaGI9Yy5Nanx8aGI7KGZ1bmN0aW9uKGMpe2MuTGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09CmIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBpYj1jLkxqfHxpYjsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaGIoYi5kZXRhaWwpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IGliKGIsdGhpcy5GKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgamI9Yy5Oanx8amIsa2I9bmV3IGpiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNqPXRoaXMuYVs3XTt0aGlzLlFuPXRoaXMuYVsxMF07dGhpcy50az10aGlzLmFbMl07dGhpcy5adD10aGlzLmFbNV07CnRoaXMuYXI9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzNdfWMuWHQ9YjtiLnByb3RvdHlwZT17Ymo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNqOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Rbjp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGs6dGhpcy5ZdChhKX0sWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp0OnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hcjp0aGlzLk5tKGEpfSxObTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT206dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgbGI9Yy5YdHx8bGIsa2Q9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWtkLmJqKDQpOyhmdW5jdGlvbihjKXtjLmxrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLmZnKGIsImVsZW1lbnRJRCIpO3RoaXMuVWc9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLlVnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToKImFmdGVyIj09dGhpcy5VZz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuVChnKTt0aGlzLlUoZyk7dGhpcy5XYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuV2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLldjKX0sZWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sa3A6ZnVuY3Rpb24oKXtlLndnKHRoaXMuV2MpO2Uua2UodGhpcy5XYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgbWI9Yy5sa3x8bWI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7CnZhciBuYj1jLmtrfHxuYjsoZnVuY3Rpb24oYyl7Yy5taz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkJhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5mZyhiLCJlbGVtZW50SUQiKTtlLndnKGEpJiYoYj1uZXcgbWIoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgbmIoYix0aGlzLkYpKS5jKCkpKTt0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBvYj1jLm1rfHxvYixwYj1uZXcgb2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXI9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzldO3RoaXMuTmg9dGhpcy5hWzhdOwp0aGlzLmw9dGhpcy5hWzVdfWMubW89YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLklyOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLk1oKGEpfSxNaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmg6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYj1jLm1vfHxxYixsZD1uZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sZC5Icig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuU2o9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9CmF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5Tanx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlBhPWE7dGhpcy5hZz10aGlzLkpoPSExO3RoaXMuT2c9ZDt0aGlzLm5oPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlBhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnhiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZsJiZsLm9lKHRoaXMuUGEudXJsKSYmCmwueGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLkZ1KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5Uaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5hZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMubmg/CnRoaXMueGIub3Blbih0aGlzLlBhLm1ldGhvZCx0aGlzLlBhLnVybCwhMSk6dGhpcy54Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCEwKSx0aGlzLkpofHwodGhpcy54Yi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMueGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy54Yi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwub2UodGhpcy5QYS51cmwpP2wueGQ/bC5uYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5vZSh0aGlzLlBhLnVybCksdGhpcy5PZyYmdGhpcy5PZygpfXJldHVybiB0aGlzLnhifX19KShjKTt2YXIgcmI9Yy5Uanx8cmI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuWmI9IiI7dGhpcy5SZD10aGlzLlliPXRoaXMuZ2I9bnVsbDt0aGlzLkRwPXRoaXMuc2I9dGhpcy5EZz0KITE7dGhpcy56YT0iIjt0aGlzLnlnPSExO3RoaXMudmE9dGhpcy5jZD0iIjt0aGlzLnZnPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5JZT0hMTt0aGlzLnRhPVtdO3RoaXMub2c9dGhpcy5LYj0iIjt0aGlzLlhkPSExO3RoaXMuV2U9MDt0aGlzLmtmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnliPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLnljPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLmpmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5NYj0iIjt0aGlzLnRiPVtdO3RoaXMuTmI9W107dGhpcy5MYj0iIjt0aGlzLlhlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaGU9ITE7dGhpcy5tcD10aGlzLnlkPW51bGw7dGhpcy5qaD10aGlzLndjPXRoaXMuVWY9CnRoaXMuWmU9dGhpcy54ZD10aGlzLlNkPXRoaXMuQWM9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19Yy5Vaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5vYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5nYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLlJkLGpzcG9wdXBzOnRoaXMuRGcsc2lkZWxvYWRzOnRoaXMuc2IsZGlzYWJsZXRlc3RzOnRoaXMuRHAsaG9tYWRBbGlhczp0aGlzLnphLGlzSW5pdGlhbGl6ZWQ6dGhpcy55ZyxnbG9iYWxDb25maWc6dGhpcy5jZCxjbGllbnRDb25maWc6dGhpcy52YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLnZnLHNlcnZlcjp0aGlzLnRhLHN2bUNvbmZpZzp0aGlzLktiLGhvbWFkQWRwYXRoOnRoaXMub2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5YZCwKdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5rZixIT01BRF9CTE9DS0VEOnRoaXMuaGYsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMueWMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLmpmLHRlc3RIaWRlOnRoaXMuTWIsdGVzdFRhZ3M6dGhpcy50Yix0ZXN0VGFnc0pTOnRoaXMuTmIsdGVzdENvb2tpZTp0aGlzLkxiLHRocm90dGxlOnRoaXMuWGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5oZSxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuQWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLlNkLHVzZVN0cmljdENoZWNrczp0aGlzLnhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLlplLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkpiLHNlcnZlcklkOnRoaXMuZWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmRjLAp2cGFpZDp0aGlzLndjLHNraXBBbGxvd2VkOnRoaXMuamh9fSxpcjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LE5lOmZ1bmN0aW9uKGEpe3RoaXMuU2FbYV09ITB9LEpxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sdmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnBiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuS28oYSl9LElhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5uZShhKTtlPXRoaXMuQ2EoYSk7Yz8odGhpcy5uYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5LZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLlpifHx0aGlzLmdifHx0aGlzLllifHx0aGlzLlJkKSYmKGs9dGhpcy5GcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkxxKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5oYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LG5lOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5uYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LG5jOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnRhJiZ0aGlzLnRhLmxlbmd0aCYmMDx0aGlzLnRhLmxlbmd0aCYmKGI9dGhpcy50YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sb2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5uZShhKTtyZXR1cm4gYn0sTHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnphJiYwPHRoaXMuemEubGVuZ3RoKXJldHVybiB0aGlzLnphO2ZvcihkIGluIHRoaXMuemEpaWYoYj10aGlzLnphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuang7cmV0dXJuIm5vbmUifSxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhW3RoaXMuZWhdfSxLZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWQoKSxiPXRoaXMuaWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEpnOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goYyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEVzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5DYShhKSxjPSIiLGM9IiIsaDtmb3IoaCBpbiBiKXtpZihiW2hdLnN1YnZhbHVlcyl7Zm9yKHZhciB5PWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2hdKS5zcGxpdCgiJiIpLGM9e30saz0wO2s8eS5sZW5ndGg7aysrKXt2YXIgbD15W2tdLnNwbGl0KCI9Iik7Y1tsWzBdXT1sWzFdfWZvcih2YXIgbSBpbiBiW2hdLnN1YnZhbHVlcyljW21dPXRoaXMuSmcoY1ttXSxtLGJbaF0uc3VidmFsdWVzW21dKTsKeT1bXTtmb3IobSBpbiBjKXkucHVzaChtKyI9IitjW21dKTtjPXk9ZW5jb2RlVVJJQ29tcG9uZW50KHkuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5KZyhkLnF1ZXJ5S2V5W2hdLGgsYltoXSk7ZC5xdWVyeUtleVtoXT1jfW09W107Zm9yKGggaW4gZC5xdWVyeUtleSltLnB1c2goaCsiPSIrZC5xdWVyeUtleVtoXSk7cmV0dXJuIGM9ZC5ob3N0K2QucGF0aCsiPyIrbS5qb2luKCImIil9LEZzOmZ1bmN0aW9uKGEpe3RoaXMuWmImJihhKz10aGlzLlpiKTtpZih0aGlzLmdiKWZvcih2YXIgYiBpbiB0aGlzLmdiKXRoaXMuZ2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMuZ2JbYl0pKTt0aGlzLlliJiYoYT10aGlzLkVzKGEsdGhpcy5ZYikpO3JldHVybiBhfSxmOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXtsPXRoaXM7dGhpcy55Zz0hMDt0aGlzLmNkPWE7dGhpcy52YT1iO3RoaXMuSWU9ZDt0aGlzLnlkPWM7dGhpcy5VYz1lO3RoaXMuSmI9aHx8e307dGhpcy51cygpO2lmKCJzdHJpbmciPT0KdHlwZW9mIHRoaXMudmEpdGhpcy5zcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy5QYygpfWNhdGNoKGspe3RoaXMubmEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sdXM6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMuY2QrdGhpcy5IYygiZ2xvYmFsIikpLHRoaXMuWnEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuTmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5QYygpfS5iaW5kKHRoaXMpLCEwKX0sc3M6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLnZhK3RoaXMuSGMoImNsaWVudCIpKTt0aGlzLkthKG5ldyB6KHRoaXMudmErdGhpcy5IYygiY2xpZW50IikpLHRoaXMuUGMuYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLk5lKCJjbGllbnQiKTt0aGlzLm5hKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxIYzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5wYigpO3RoaXMuSmImJnRoaXMuSmIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkpiJiZ0aGlzLkpiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0sbmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuU2Qpe3RoaXMuU2Q9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGcpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07dGhpcy5VYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVjP3RoaXMuVWMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYWE9dGhpcy52Zz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuaGYpKTt0aGlzLnZiKCk7ZS5lYyhrLkx0KTsoYj1lLmtnKHRoaXMuZWQoKSkpfHwoYj1lLmtnKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxacTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5LYnx8dGhpcy56YXx8dGhpcy5QYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMueWIpKSx0aGlzLnZiKCkpfX0sUGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMudmF9ZWxzZSBhPXRoaXMudmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5PYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMudGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnRhLmxlbmd0aDtiKyspdGhpcy50YVtiXT10aGlzLnRhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLktiPWEuY29uZmlnfHwiIjt0aGlzLnphPWEuYWxpYXN8fG51bGw7dGhpcy5vZz1hLmFkcGF0aHx8IiI7dGhpcy5YZD1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLmVoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnRhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuS2ImJnRoaXMuemEmJnRoaXMudGEubGVuZ3RoP3RoaXMuaGQoITEpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksdGhpcy52YigpKX0saGQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2UoKSksYz10aGlzLkNhKHRoaXMuS2IpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5LYit0aGlzLkhjKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5pdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OZSgiY3VzdG9tZXIiKTthP3RoaXMuU2w/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5TbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLmhkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxpdjpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnhkPXRoaXMuT2IoYi5zdHJpY3QpO3RoaXMuWmU9dGhpcy5PYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5VZj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuZGM9dGhpcy5PYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuT2IoYi5lbmFibGVkKTt0aGlzLk1iPWIudGVzdGhpZGV8fCIiO3RoaXMudGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk5iPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWmI9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5nYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuUmQ9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLkRnPWIuanNwb3B1cHN8fCExO3RoaXMuc2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMud2M9Yi52cGFpZHx8ITE7dGhpcy5KYi52cGFpZD10aGlzLndjO3RoaXMuamg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5NYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuTGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5UcShiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMuWGQmJih0aGlzLkxiPW51bGwpO3RoaXMuWGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5oZSYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaGU9ITAsdGhpcy5oZCghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5BdigpJiYodGhpcy5NYnx8dGhpcy5OYnx8dGhpcy50Ynx8dGhpcy5MYik/dGhpcy5JZT8odGhpcy5vYT10aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSksCnRoaXMuVGQoKSx0aGlzLnZiKCkpOnRoaXMubnYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5vdigpKX19LG52OmZ1bmN0aW9uKCl7dGhpcy5tdigpO3RoaXMucHYoKX0scHY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsYz0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGg9CmUua2EoMTApLHk9ZS5rYSgxMCksaz1lLmthKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeSxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JythKGspKydceDNjL3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZXZhbCgiJythKHkpKyciKVx4M2Mvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwnK2UuaGIoYShoKSkrJyI+XHgzYy9zY3JpcHQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyl9Y2F0Y2gobCl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKTsKMyE9YyYmZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX0sMUUzKX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpfSx3ZDpmdW5jdGlvbihhKXt0aGlzLkFjPSEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnZiKCksdGhpcy5UZCgpKX0sbXY6ZnVuY3Rpb24oKXtpZih0aGlzLk1iKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLk1iKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuTWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0KMD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9Y31jYXRjaChmKXt9YT90aGlzLndkKHRoaXMueWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLnJoKCl9ZWxzZSB0aGlzLnJoKCl9LHFoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnBiKCkpO3RoaXMuc3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy53ZCh0aGlzLnljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy50Yj1udWxsLHRoaXMuVGUoKX0sc3Y6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksCiEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkthKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxyaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5wYigpKTt0aGlzLnR2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5xaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMud2QodGhpcy55YywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5OYiYmdGhpcy5OYi5sZW5ndGgpe3ZhciBjPXRoaXMuTmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5xaCgpfSx0djpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksCiEwKTohMX12YXIgaz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LFRlOmZ1bmN0aW9uKCl7dGhpcy5MYj8odGhpcy5XZSsrLHRoaXMuS2EobmV3IHoodGhpcy5MYiksdGhpcy5sdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5VZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLm9oKCl9LFVlOmZ1bmN0aW9uKGEpe3RoaXMud2QodGhpcy5qZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrCmEpfSxsdjpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5XZT90aGlzLlRlKCk6dGhpcy5VZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMub2goKTp0aGlzLlVlKCJBQUEiKX0sb2g6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnliKSk7dGhpcy52YigpO3RoaXMuVGQoKX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5BYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMua2YpKTt0aGlzLnlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueWQmJnRoaXMueWQoKX0sanA6ZnVuY3Rpb24oKXtpZih0aGlzLlplJiYKdGhpcy5pcigpKXt2YXIgYT10aGlzLkpxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSx0aDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsYixjLGYsaCx5KXthPW5ldyByYihhLGIsYyk7ZiYmKGEuSmg9ITApO2gmJmUuU3IoKSYmKGEuYWc9ITApO3kmJihhLm5oPSEwKTtyZXR1cm4gYS5sb2FkKCl9LEVmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk5hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCwKZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMubmMoKXx8KGE9dGhpcy5DYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJgp0aGlzLm5hKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxpcDpmdW5jdGlvbigpe3RoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuSWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hdy5iaW5kKHRoaXMpLHRoaXMuJHYuYmluZCh0aGlzKSl9LGF3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5vcSgpfSwkdjpmdW5jdGlvbigpe30sb3E6ZnVuY3Rpb24oKXtlLmVjKGsubnEpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LFRkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuc2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5zYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnNiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MubWMoKV09dGhpcztlLk5hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEF2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGV9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxwYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxrYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LGhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxDYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxpaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHYsdCx3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt2PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8fm4mdikrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTIwOzM5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnQ9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhuJnB8biZ2fHAmdikrdCtoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsobl5wXnYpK3QraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD12LHY9cCxwPWMobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHNiPWMuVWp8fHNiLGw9bmV3IHNiO3dpbmRvdy5BeD1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkN2PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs4XTsKdGhpcy5Udj10aGlzLmFbMTBdO3RoaXMuZXQ9dGhpcy5hWzRdO3RoaXMua3Y9dGhpcy5hWzNdO3RoaXMudnE9dGhpcy5hWzhdO3RoaXMuTGk9dGhpcy5hWzRdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuV3c9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNV19Yy5Ccz1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQ3Y6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmV0OnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rdjp0aGlzLnVxKGEpfSx1cTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnE6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxpOnRoaXMuenQoYSl9LAp6dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXQ6dGhpcy5WdyhhKX0sVnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld3OnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdGI9Yy5Cc3x8dGIsbWQ9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWQuQnYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLk8/dGhpcy5PYT1hLm0uTygpOnRoaXMuT2E9IiI7dGhpcy5jb250YWluZXI9dGhpcy5iLlRhO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuQmI9dGhpcy5LYz0hMTt0aGlzLkdvPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5SPWI7dGhpcy5yYT17fTsKdGhpcy52aWRlbz17fTt0aGlzLnVkPXt9O3RoaXMuSWM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5JYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIubSkmJnRoaXMuYi5tLnYmJihhPXRoaXMuYi5tLnYoKSksdGhpcy5JYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Lbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLnRkPSExO3RoaXMuR2c9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLkdjPSExO3RoaXMud2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5FYj0hMTt0aGlzLnZwPWUua2EoMTApO3RoaXMuR2I9ZS5rYSgxMCk7dGhpcy5wYz1lLmthKDEwKTt0aGlzLmtoPWUua2EoMTApO3RoaXMuY29uZj0Ke307dGhpcy5jYz10aGlzLm9iPSExO3RoaXMuJGQ9bnVsbDt0aGlzLkJkPXRoaXMud2I9dGhpcy5qZT10aGlzLkZlPXRoaXMuVWQ9dGhpcy5UYz10aGlzLlNlPXRoaXMuUmI9dGhpcy5EZD10aGlzLlFnPXRoaXMuWGM9dGhpcy5Fdj10aGlzLmViPSExO3RoaXMuVmI9W119Yy5Paj1iO2IucHJvdG90eXBlPXtmaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSx1aDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5SLkFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudyhrLkJuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LApzZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5lYj1jO2lmKHRoaXMuUi5hYSl0aGlzLlIuanAoKSx0aGlzLlIub2EmJnRoaXMuUi5pc0VuYWJsZWQ/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5SLndjfSkpOmI/KHRoaXMudWgoKSxuZXcgVSh0aGlzLGEsdGhpcy5HZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUi53Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuRmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2UoYSxiLGMpfSw1MCl9fSxEZTpmdW5jdGlvbihhKXt0aGlzLkJkPXRoaXMud2I9dGhpcy5YYz0hMTt0aGlzLmc9YTt0aGlzLk51KHRoaXMuZyk7dGhpcy5sZyhhKTt0aGlzLlZiPXRoaXMuY2coYSl9LGxnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiYKYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy51ZD10aGlzLlZxKGEpKSx0aGlzLmxnKGEucGFyZW50KSl9LGNnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5jZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5XKXtiPWEuVy5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuVyl7Yj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLlcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuVy5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5XLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sbWE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSwKYS5WYyYmYS5WYy5lcnJvciYmYS5WYy5lcnJvci5jb2RlJiYoYj1hLlZjLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcueGMuY29kZTpiPT1DLkZkLmNvZGU/ZS53KGsuRXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTooZS50ZSgpLGI9PUMubmYuY29kZSYmZS53KGsuTXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk7ZS53KGsubXEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LmxmLmNvZGU6ZS53KGsuYncsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3Lm9mLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsuSXcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrOwpjYXNlIHcuR2QuY29kZTplLncoay5Qdyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuRWQuY29kZTplLncoay5Ocyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnFhJiYoYys9Il8iK2EuZXJyb3IucWEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5DYihhKTt0aGlzLkZhKCl9LENiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5FYS5sZW5ndGg7KXRyeXt2YXIgYz0KYS5FYS5wb3AoKTt0aGlzLnJlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxOdTpmdW5jdGlvbihhKXt0aGlzLlVkPXRoaXMuamU9dGhpcy5GZT0hMTt0aGlzLnJhPXRoaXMuYi5IO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1iO2I9dGhpcy5iLkc7Yi5JeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuS24mJnRoaXMucGxheWVyLmdjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5nYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuUy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5TW2NdLnR5cGUpJiZ0aGlzLkduKGIsYS5TW2NdLnVybCsiIixhLlNbY10udHlwZSk7dGhpcy5zaChiKT8odGhpcy5JbihiKSwKYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIiksdGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5nLnFwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdSgpKTp0aGlzLm1lKCk/dGhpcy5oaCgpOnRoaXMuZy5vcmlnaW4uVmYody5FZCl9LApMdTpmdW5jdGlvbigpe3RoaXMuUmI9dGhpcy5EZD0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGUudyhrLkxmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy5SYj0hMCk7ZS5KZigpO3RoaXMuZyYmdGhpcy5nLm9yaWdpbiYmdGhpcy5nLm9yaWdpbi5lZiYmZS5Kbih0aGlzLmcub3JpZ2luLmVmKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkc7dGhpcy5iLkc9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5HLGEpO3RoaXMuYi5SZygpO3RoaXMuYi50YygpO2ZvcihhPXRoaXMuYi5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIudGMoKTt0aGlzLmRhPXRoaXMucmE9dGhpcy5iLkg7dGhpcy5hZigidnBhaWQiKTt0aGlzLlJiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYykuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKTt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5OLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSC5hcHBlbmRDaGlsZCh0aGlzLk4pO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5lYSYmdGhpcy5iLm0uZWEoKSYmKGE9ITApO3ZhciBiPQp0aGlzLmcuWHEoKSxjPXRoaXMuZy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGg9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLkguc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSC5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5OLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLk4sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5OLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuTiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpOwphPWUuWG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlIpO3RoaXMuTi5zcmM9YTtlLk9kKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLlZiPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy50dygpLHRoaXMuYi5qYyghMCksIXRoaXMud2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLndiPXtlbDp0aGlzLk4sY2I6ZnVuY3Rpb24oKXt0aGlzLkJkPSEwO2UudyhrLkZoLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLmxlKHRoaXMud2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5qYyghMCksdGhpcy54dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuamMoITApLHRoaXMuQncoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuencoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5DdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy55dygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5HaCgpO2lmKCJBZENsaWNrVGhydSI9PQphLmRhdGEubmFtZSl7Yj1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2J8fChiPXRoaXMuZy5hYyk7aWYoIWIpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RyeXt2YXIgaD13aW5kb3cub3BlbigiIix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKTtoLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7aC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWJ9Y2F0Y2goeSl7d2luZG93Lm9wZW4oYix0aGlzLlIub2E/Il90b3AiOiJfYmxhbmsiKX19IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnV3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLnZ3KCk7IkFkVm9sdW1lQ2hhbmdlIj09CmEuZGF0YS5uYW1lJiYoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBjKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuUmI9ITAsaC5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuUmI9ITEsaC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay55aCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKSxlLncoay5NZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX19LmJpbmQodGhpcykpO2UuT2QoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuRmEoKX0uYmluZCh0aGlzKSk7ZS5PZCgidnBhaWRlcnJvcyIsCmZ1bmN0aW9uKCl7dGhpcy5GYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuRG4oZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLk4sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSx1dzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkRkPSEwfSx2dzpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkRkPSExfSx4dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLnlmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LHd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSx0dzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIik7ZS53KGsudGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0sQnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuUWEoInN0YXJ0Iik7ZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5RYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLnJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpO2UudyhrLnZmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuUWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay56ZiwKdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKX0seXc6ZnVuY3Rpb24oKXt0aGlzLnpkKCk7ZS5RYSgiY29tcGxldGUiKX0sR2g6ZnVuY3Rpb24oYSl7aWYodGhpcy5OJiZ0aGlzLk4ucGFyZW50Tm9kZSYmdGhpcy5OLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5RYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5OLnBhcmVudE5vZGU7dGhpcy5OLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5OKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5OPWUuYmE9ITE7dGhpcy5GYShhKX19LHN3OmZ1bmN0aW9uKGEpeyhhPWEubWVzc2FnZSl8fGV2ZW50LmRhdGEmJmV2ZW50LmRhdGEub3JpZ2luYWxldmVudCYmZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGE9ZXZlbnQuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLCEwKTtlLlFhKCJlcnIiLGEpO2UudyhrLkR3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7CnRoaXMuR2goITApfSxHbjpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlI7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLm5jKCk/KGY9ZS5DYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmh3LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxJbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwKdGhpcy56ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkFkLmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5FaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLmJmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5jZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnpkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuQWQuYmluZCh0aGlzKSl9LEVoOmZ1bmN0aW9uKGEpe3RoaXMuQmJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYnx8dGhpcy5iZihhKX0uYmluZCh0aGlzKSx0aGlzLkdvKSl9LGJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktjJiZ0aGlzLnNoKHRoaXMudmlkZW8pJiYKIXRoaXMub2ImJiF0aGlzLkJiKXt0aGlzLktjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5nLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5vYnx8KHRoaXMub2I9ITAsdGhpcy5vZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlIuVWZ8fHRoaXMuUi5uYSgidmlkZW8tbm9vcCIpKTt0aGlzLkZhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuZ3coKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi50YygpO3RoaXMuQ2goKTt0aGlzLmFmKCk7dGhpcy5DZigpO3RoaXMuYi5SZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5SZSgpfX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy5UYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsKImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5KYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5kZD1bXTtmb3IodmFyIGI9dGhpcy5iLkgsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuZGQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09CmEuZGF0YSl7dGhpcy5FYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5FYygpfWVsc2UgdGhpcy5FYygpfSxFYzpmdW5jdGlvbihhKXtpZih0aGlzLmRkKWZvcih2YXIgYj0wO2I8dGhpcy5kZC5sZW5ndGg7YisrKXRoaXMuZGRbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuVGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLkZhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLApiLCEwKSk6KHRoaXMuS2coITApLHRoaXMuRWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuamUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLkZlPSEwfS5iaW5kKHRoaXMpKTtlYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5IYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5IYi5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMuR2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLlJlKCkpfS5iaW5kKHRoaXMpO3RoaXMuY2UoKS5naCh0aGlzKX0semQ6ZnVuY3Rpb24oKXt0aGlzLlIuZGMmJiF0aGlzLm9iJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS53KGsueW4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLkZhKCl9LEZhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlVkKWlmKHRoaXMuVWQ9ITAsdGhpcy5CZHx8KGUudyhrLlZzLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5nLmJifHx0aGlzLmcuVGIpe3RoaXMuQmI9dGhpcy5LYz0hMTt0cnl7dGhpcy5vZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMudGQ9ITE7dHJ5e3RoaXMuYi56aCgpfWNhdGNoKGgpe310aGlzLlNlPSEwO3RoaXMuYi5nZSgpO3RoaXMuRWI9ITE7dGhpcy5jZSgpLmFoKCk7dGhpcy5nLmJiJiZ0aGlzLmcub3JpZ2luLnllKCk7dGhpcy5nLlRiJiYoYT90aGlzLmcub3JpZ2luLkxnKCk6CnRoaXMuVmQoKSl9ZWxzZSB0aGlzLlZkKCl9LGh3OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMub2QodGhpcy52aWRlbyksdGhpcy5tZSgpP3RoaXMuaGgoKTp0aGlzLkFkKGEpKX0sQWQ6ZnVuY3Rpb24oYSl7dGhpcy5CYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5tZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jY3x8dGhpcy5SLkVmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlIuRWYoKSk7dGhpcy5nLm9yaWdpbi5WZih3LkVkKX0sY2Y6ZnVuY3Rpb24oKXtpZih0aGlzLkV2KXRoaXMuRmEoKTsKZWxzZXt0aGlzLkViPSEwO3RoaXMuYi5tLiRhJiYhdGhpcy5TZSYmdGhpcy5iLm0uJGEoKSYmZS53KGsuUmMsdGhpcy5iLm0udigpLHRoaXMuQigpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuSnYoYSk7aWYoIXRoaXMud2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy53Yj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuQmQ9ITA7ZS53KGsuRmgsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9OwplLmxlKHRoaXMud2IpfWM9IiI7dGhpcy5nLlFlJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmtoKSkmJihjPXRoaXMuZy5RZS1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy50ZHx8KHRoaXMudGQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS53KGsueGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKTt0aGlzLmcuYmI/KHRoaXMuQmI9dGhpcy5LYz0hMSx0aGlzLm9kKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMudGQ9ITEsdGhpcy5iLnpoKCksdGhpcy5nLm9yaWdpbi55ZSgpKTp0aGlzLkZhKCl9LmJpbmQodGhpcykpKSksCmIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5JYy5yZXBsYWNlKCJbdGltZV0iLGUuYmcodGhpcy5nLmR1cmF0aW9uLWEpKSk7dGhpcy5HYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saGg6ZnVuY3Rpb24oKXt0aGlzLmNjPSEwO3RoaXMucmE9dGhpcy5iLkg7dGhpcy5yYS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLAoiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLlFxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7dGhpcy5iLkc9YTt2YXIgYj10aGlzLmIuRyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSI7dGhpcy5kYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYi50YygpO3RoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMucmEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnJhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5EaC5iaW5kKHRoaXMpO3RoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5DaCgpO3RoaXMuYWYoKTt0aGlzLiRkPXNldEludGVydmFsKHRoaXMuaHAuYmluZCh0aGlzKSwxMDApO3JldHVybiBhfSxRcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMuZy5TLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlNbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUjtoLm9hJiYKaC5pc0VuYWJsZWQmJiFoLm5jKCkmJihlPWguQ2EoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxocDpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5nLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMuJGQpLHRoaXMuemQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy5jZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy4kZCksdGhpcy5BZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LHZoOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITAsdGhpcy5YY3x8CmUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxKdjpmdW5jdGlvbihhKXthPT10aGlzLndofHx0aGlzLm9ifHwoMD09YSYmKHRoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9ITEpLHRoaXMuRmV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMuamU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZoKCl9LmJpbmQodGhpcykpLHRoaXMuY2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLm9ifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudyhrLnRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSksZS53KGsueWYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLmNjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlIuZGMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS53KGsucmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmcuZHVyYXRpb24vMikmJih0aGlzLlIuZGMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLnZmLHRoaXMuZy5BLAp0aGlzLmIubS52KCksdGhpcy5CKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5SLmRjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSksZS53KGsuTWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLndoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLm9iKXtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5XcSh0aGlzLmcuRWEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMudWQuaW1wcmVzc2lvbnMmJgplLlFyKGgudXJsLHRoaXMudWQuaW1wcmVzc2lvbnMpP3RoaXMucmUoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudyhrLkFuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLnVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5yZShoLnVybCxoLnR5cGUpfWNhdGNoKHkpe31pZighYil0cnl7dGhpcy5nLkVhPXRoaXMuenAodGhpcy5nLkVhLGEpfWNhdGNoKGwpe319fSxyZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlIuSWEoYSksYyYmYS5GbihjKSxmfHwoZj10aGlzLlRmKSx0aGlzLlIuS2EoYSxmLHRoaXMuVGYsITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx6cDpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sZ3c6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuRGguYmluZCh0aGlzKX0sRGg6ZnVuY3Rpb24oKXtlLncoay5LZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5YYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5FcSgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5SLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmcuYWN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5nLmFjLHRoaXMuUi5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuSWMucmVwbGFjZSgiW3RpbWVdIixlLmJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlIuTWMmJgooYj10aGlzLlIuTWMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSxoYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxxZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5SLk1jKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy52cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmQoKTt0aGlzLnFkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9CiJwb2ludGVyIik7Yy5pZD10aGlzLkdiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSXYuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Idi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJkKCk7dGhpcy5xZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLmhjKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09InJpZ2h0IixmLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtmLmlkPXRoaXMucGM7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkd2LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRnYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5oYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUudG9wPQoiLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMua2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5RZSYmYi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGYpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5yZCgpO3RoaXMucWQoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5pYygpO3RoaXMuaGMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmRhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmVhJiZ0aGlzLmIubS5lYSgpJiYoZS53KGsuTGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSx0aGlzLktnKCkpO3RoaXMuaWMoKX19LGljOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0scmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sSHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRy5wYXVzZWQ/KHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS53KGsuRmMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSk6KHRoaXMuYi5HLnBhdXNlKCksYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuS2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5EZD9lLmphKHRoaXMuTiwiY29udHJvbCIsInBsYXkiKTplLmphKHRoaXMuTiwiY29udHJvbCIsInBhdXNlIil9LEJlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkcucGF1c2VkfHwodGhpcy5iLkcucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLktkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxydTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5HLnBhdXNlZCYmKHRoaXMuYi5HLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksCmUudyhrLkZjLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpfSxGdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkPyh0aGlzLmIuRy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLnloLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSkpOih0aGlzLmIuRy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5qZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpKX0sR3Y6ZnVuY3Rpb24oKXt0aGlzLlJiP2UuamEodGhpcy5OLCJjb250cm9sIiwidW5tdXRlIik6ZS5qYSh0aGlzLk4sImNvbnRyb2wiLCJtdXRlIil9LApLZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGMpO3RoaXMuYi5HLm11dGVkfHwodGhpcy5iLkcubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsuamQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpKSl9LEhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuSGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkhiKTt0aGlzLlRjfHx0aGlzLkdjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5SZSgpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLlRjPSEwO3RoaXMuZWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWIpLHRoaXMuZWI9CiExKTtpZigoInByZXJvbGwiPT1lLkphJiZ0aGlzLkdjfHwicG9zdHJvbGwiPT1lLkphKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkphKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkg7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi50YygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5XZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLldkKCl9ZWxzZSB0aGlzLldkKCl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5TZT0hMDt0aGlzLmIuZ2UoKTt0aGlzLmIuc3UoKTt0aGlzLkViPSExO2UudyhrLnVwLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSk7dGhpcy5jZSgpLmFoKCl9LGNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYKKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LENmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54YSgibWluVmlzIik7YSYmKGUua2UodGhpcy52aWRlbyxhKT90aGlzLnJ1KCk6dGhpcy5CZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmFjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuVmImJgowPHRoaXMuVmIubGVuZ3RoJiYoYS5hZElkcz10aGlzLlZiKSk7cmV0dXJuIGF9LFRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLk9qfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp1PXRoaXMuYVsxMF07dGhpcy5obD10aGlzLmFbMl07dGhpcy5saj10aGlzLmFbMl07dGhpcy5acj10aGlzLmFbNl07dGhpcy5DbT10aGlzLmFbOV07dGhpcy55cD10aGlzLmFbM107dGhpcy5ndj10aGlzLmFbMV07dGhpcy4kbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy5pdT1iO2IucHJvdG90eXBlPXtZdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnU6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhsOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLllyKGEpfSxZcjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlpyOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5DbTp0aGlzLnhwKGEpfSx4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuZnYoYSl9LGZ2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ndjp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJG86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgdWI9Yy5pdXx8dWIsbmQ9bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmQuWXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5NYT1udWxsO3RoaXMuWD1bXTt0aGlzLlc9bnVsbDt0aGlzLlViPQp0aGlzLldiPSExO3RoaXMuZWY9IiI7dGhpcy5kZj0hMTtkJiZkLmVtcHR5P3RoaXMueHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5IbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5RZigpLGI7Yj1lLkNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTpsLklhKGwudmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5OZih0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiYKdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC52ZChhKSkrIiZ0eXBlPWpzIixiPWwuSWEobC52ZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOgpiPWwuSWEobC52ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkthKGIsdGhpcy53cy5iaW5kKHRoaXMpLHRoaXMudHMuYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5KYSl0cnl7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSmF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkphKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChkKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx3czpmdW5jdGlvbihhKXt0aGlzLmp1KGEpO3RyeXt0aGlzLk1hPWEucmVzcG9uc2VYTUwsdGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm1hKHRoaXMuR2Eody5HZCkpfXRoaXMuWD10aGlzLmRnKCk7dGhpcy5XYj10aGlzLlZlKCk7dGhpcy5VYj10aGlzLnBoKCk7dGhpcy5YLmxlbmd0aD90aGlzLnFjKCk6dGhpcy5tYSh0aGlzLkdhKHcueGMse2Vycm9yOnRoaXMuZGY/Qy5GZDpDLm1mfSkpfSx4czpmdW5jdGlvbihhKXt0cnl7dGhpcy5NYXx8KHRoaXMuTWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLkdhKHcuR2QpKX10aGlzLlg9dGhpcy5kZygpO3RoaXMuV2I9dGhpcy5WZSgpO3RoaXMuVWI9dGhpcy5waCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5xYygpOnRoaXMubWEodGhpcy5HYSh3LnhjLHtlcnJvcjp0aGlzLmRmP0MuRmQ6Qy5tZn0pKX0sdHM6ZnVuY3Rpb24oKXt0aGlzLm1hKHRoaXMuR2Eody5sZix7ZGVwdGg6YX0pKX0scWM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5YLnNoaWZ0KCk7CnRoaXMuVnIoKT90aGlzLnV2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMubWcoKSxnLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMubWEodGhpcy5HYSh3Lm9mKSk6KGE9MCx0aGlzLld2KCkmJnRoaXMuRGUodGhpcy53cCgpKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy5XYj8odGhpcy5XYj0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5xYygpKTp0aGlzLnBhcmVudC55ZSgpfSxMZzpmdW5jdGlvbigpe3RoaXMuVWI/KHRoaXMuVWI9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMucWMoKSk6dGhpcy5wYXJlbnQuTGcoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydigpP3RoaXMucXYoKT8hMDooLTEhPXRoaXMuZmMoKT90aGlzLm1hKHRoaXMuR2Eody5nZikpOnRoaXMubWEodGhpcy5HYSh3LkdpKSksITEpOih0aGlzLm1hKHRoaXMuR2Eody54YyxDLm5mKSksITEpfSxEZTpmdW5jdGlvbihhKXthLkVhPQphLkVhLmNvbmNhdCh0aGlzLnZlKCkpO2EuYmI9YS5iYj9hLmJiOnRoaXMuV2I7YS5UYj1hLlRiP2EuVGI6dGhpcy5VYjt0aGlzLnBhcmVudC5EZShhKX0sd3A6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgdmI7YS5kdXJhdGlvbj10aGlzLmZjKCk7YS5TPXRoaXMuaWcoKTthLmFjPXRoaXMuRnEoKTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkFxKCk7YS5RZT10aGlzLlVxKGEuZHVyYXRpb24pO3JldHVybiBhfSxtYTpmdW5jdGlvbihiKXt0aGlzLlcmJihiLkVhPWIuZXJyb3IuY29kZSE9dy5nZi5jb2RlP2IuRWEuY29uY2F0KHRoaXMuSHEoKSk6Yi5FYS5jb25jYXQodGhpcy5PcSgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkNiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuQ2ImJnRoaXMucGFyZW50LkNiKGIpLGE9MCx0aGlzLnFjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5tYSYmCnRoaXMucGFyZW50Lm1hKGIpLGE9MCl9LENiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LkNiKGEpfSxWZjpmdW5jdGlvbihhLGIpe3RoaXMubWEodGhpcy5HYShhLGIpKX0sR2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgd2IoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx1djpmdW5jdGlvbigpe3JldHVybiBhPGd9LHJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5pZygpLmxlbmd0aH0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmZjKCl9LFZlOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0scGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlgmJjI8PXRoaXMuWC5sZW5ndGgmJiF0aGlzLlZlKCkmJihhPSEwKTtyZXR1cm4gYX0sanU6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLmVmPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sVnI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLm1nKCkubGVuZ3RofSxtZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJlKHRoaXMuVywiVkFTVEFkVGFnVVJJIil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmUodGhpcy5XLCJBZFN5c3RlbSIpfSx2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLlZhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sT3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sSHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmEodGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksCkxjOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxteDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5WYShhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5MYyktTWF0aC5hYnMoNzAwLWIuTGMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5XLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTsKYSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGc9W10sYj0hMSxkPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Q9Yj10aGlzLmJkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWcucHVzaChjKTtlLnB1c2goZCl9MTxhLmxlbmd0aD8oYj1nLGg9ZCk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxmYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLlZhKHRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO3RyeXtjPXRoaXMuVy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sCmc9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuWHUoZyxhKSwwPmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxiZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LGVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJkKGEpOiIifSxiZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5IbXx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMub2s9dGhpcy5hWzEwXTt0aGlzLk1tPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMuUWg9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9rOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHhiPWMuUWh8fHhiLG9kPW5ldyB4YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9kLm5rKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuRWE9W107dGhpcy5TPVtdO3RoaXMuYWM9IiI7dGhpcy5BPXRoaXMuVGI9dGhpcy5iYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuSGw9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0KMDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiExLGI9MDtiPHRoaXMuUy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLlNbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5TW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuU1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlNbYl07cmV0dXJuIGF9fX0pKGMpOwp2YXIgdmI9Yy5IbHx8dmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY289dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzEwXTt0aGlzLlNwPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs5XTt0aGlzLllqPXRoaXMuYVszXTt0aGlzLnFvPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuSXM9YjtiLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNvOnRoaXMuZnEoYSl9LGZxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmNsOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWo6dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFvOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIHliPWMuSXN8fHliLHBkPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBkLmJvKDQpO3ZhciB3PXtHZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixxYToiWE1MX1BBUlNFX0VSUk9SIn0sR2k6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHFhOiJEVVJBVElPTl9FUlJPUiJ9LHhjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKcWE6IkVNUFRZX1ZBU1QifSxvZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixxYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sbGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnFhOiJMT0FEX0VSUk9SIn0sRWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHFhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sYng6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIscWE6Ik1FRElBRklMRV9FUlJPUiJ9LGdmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHFhOiJEVU1NWV9BRCJ9fSxDPXttZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHFhOiJOT19BRFMifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIscWE6Ik5PX01FRElBRklMRVMifSxkeDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIscWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxGZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixxYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzZdO3RoaXMuVWk9dGhpcy5hWzFdO3RoaXMuS3I9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzNdfWMua3M9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFsOnRoaXMuYWsoYSl9LGFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5iazp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWk6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktyOgp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMua3N8fHpiLHFkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFkLiRrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuVmM9Yjt0aGlzLkVhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5xaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHdiPWMucWp8fHdiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLnltPXRoaXMuYVs0XTt0aGlzLnNvPXRoaXMuYVsxMF07dGhpcy5vdD10aGlzLmFbNl07dGhpcy5ZaT10aGlzLmFbOF07dGhpcy5QaD10aGlzLmFbMl07dGhpcy5vbD0KdGhpcy5hWzZdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMueW89dGhpcy5hWzJdO3RoaXMuSWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuVGs9YjtiLnByb3RvdHlwZT17Qm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNvOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bTp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm90OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLk9oKGEpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUGg6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm9sOnRoaXMudG8oYSl9LHRvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51bzp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW86CnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuVGt8fEFiLHJkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJkLkJvKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuVGE9YS5lZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9ZS5rYSgxMCk7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuQWc9ITE7dGhpcy5rYz1bXX1jLk1pPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHwKZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodjpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHpoOmZ1bmN0aW9uKCl7dGhpcy5HPUIucG9wKCk7dGhpcy5HfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkcuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSZzpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLlJjLHRoaXMubS52KCkpfSwKc3U6ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5tLnBsYXkoKSxlLncoay5TYyx0aGlzLm0udigpKSl9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkguc3R5bGUuekluZGV4PWE7dGhpcy5ILnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5ILnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5ILnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkguc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiOwp0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMubS5JYiYmdGhpcy5tLkliKCk/dGhpcy5tLmVnKCkuYXBwZW5kQ2hpbGQodGhpcy5IKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5qYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sT3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDsKYi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGpjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuZ2UoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMubS5JYigpPyh0aGlzLkguc3R5bGUubGVmdD0iMHB4Iix0aGlzLkguc3R5bGUudG9wPSIwcHgiKToodGhpcy5ILnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmtjLmxlbmd0aDthKyspdGhpcy5rY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLmxoKHRoaXMuSCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuamMuYmluZCh0aGlzKSwxMCl9LERuOmZ1bmN0aW9uKGEpe3RoaXMua2N8fCh0aGlzLmtjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5rYy5wdXNoKGEpfSxnZTpmdW5jdGlvbigpe3RoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO3RoaXMuRyYmdGhpcy5HLnBhdXNlJiZ0aGlzLkcucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBPPWMuTWl8fE8sQj1bXSxCYj0wOzEwMD5CYjtCYisrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtNLmlkPWUua2EoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzRdO3RoaXMuJHA9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy5UaD1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWk6dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgQ2I9CmMuVGh8fENiLHNkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNkLmRpKDQpOyhmdW5jdGlvbihjKXtjLnVsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlQoYSk7dGhpcy5QZShiKTt0aGlzLlJmKCl9LFBlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMueWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLnlhKCk7CmlmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIERiPWMudWx8fERiOyhmdW5jdGlvbihjKXtjLnRsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuQWI9dGhpcy5BYnx8ITE7dGhpcy51Zj10aGlzLndmPXRoaXMuc2c9dGhpcy5wYT10aGlzLlllPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlllPSEwO3RoaXMuc2cmJnRoaXMuSWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywKImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkua2I7YSYmYS5FYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk5jKCk7dGhpcy5zZz0hMDt0aGlzLklmKCl9LmJpbmQodGhpcykpO3RoaXMuRGYoKX0sSWY6ZnVuY3Rpb24oKXtpZighdGhpcy5BYil7dGhpcy5OYygpO2lmKCF0aGlzLlllJiYhdGhpcy5OYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuWWUmJnRoaXMudWYmJiF0aGlzLndmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoKX0uYmluZCh0aGlzKSwxMDApfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmpnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7CnJldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZjpmdW5jdGlvbigpe2lmKHRoaXMuTmMoKSl7dmFyIGI9dGhpcy5qZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLndmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMudWY9Yi5peH10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpLDEwMCl9LHB4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkR4KCk6ITF9LGZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuZmMoKTotMX0sUHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLkFiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuQWJ8fDMwMj09dGhpcy5BYj90aGlzLnBhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5BYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMucGE/KHRoaXMucygpLHRoaXMuZ2EoKSk6Yi5mZCgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlBxKGIpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBFYj1jLnRsfHxFYjsoZnVuY3Rpb24oYyl7Yy52bD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LFRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxsLnJuLnBuP3dpbmRvdy5PTy5MbC5ybi5wbi5neChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UcigpfSwxMDApfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO3ZhciBiPWZhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkhhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBEYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgRWIoYywKdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBGYj1jLnZsfHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbOV19Yy5adz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgSGI9Yy5ad3x8SGIsdGQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGQuVHAoNCk7KGZ1bmN0aW9uKGMpe2Muemk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5sYT0hMTt0aGlzLm5nKCl9LG5nOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlQoYiksdGhpcy5VKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKZmE6ZnVuY3Rpb24oKXt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5LJiYoMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgSWI9Yy56aXx8SWI7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93Lm54PWI7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSwKdGhpcy5nYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmdhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueWl8fEpiOyhmdW5jdGlvbihjKXtjLkFpPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sWmc6ZnVuY3Rpb24oYil7Yj1uZXcgSWIoYik7Yi5sYT90aGlzLkooKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBKYihiLHRoaXMuRikpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLnRxfHwodGhpcy50cT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLApmdW5jdGlvbihhKXt0aGlzLlpnKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5aZyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuSigpfX0pfSkoYyk7dmFyIEtiPWMuQWl8fEtiLFY9bmV3IEtiKHEpO1YuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzVdfWMuRm89YjtiLnByb3RvdHlwZT17VnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmw6YX19fSkoYyk7dmFyIExiPWMuRm98fExiLHVkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXVkLlZ0KDQpOyhmdW5jdGlvbihjKXtjLmZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxJYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuZW09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5OZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3guTmQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp4Lk5kKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuY3QoYSl9LmJpbmQodGhpcykpO3guaHIoKX0sY3Q6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5nYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBYPWMuZW18fFg7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9CltdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLmtkJiYoYj1lLkNwKGIsdGhpcy5rZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkkoZCkpe3RoaXMuTChkKTt2YXIgZj1uZXcgWChkLHRoaXMuRik7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMua2R8fCh0aGlzLmtkPVtdKSx0aGlzLmtkLnB1c2goYlthXSksZD1uZXcgVyhoKSwKdGhpcy5JKGQpfHwodGhpcy5MKGQpLGY9bmV3IFgoZCx0aGlzLkYpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkooKX0sTmQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2JdfHwodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sdnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5vY3x8KHRoaXMub2M9W10pLHRoaXMub2MucHVzaChiKSx0aGlzLnF1KCkmJih0aGlzLk1lKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LApocjpmdW5jdGlvbigpe2lmKHRoaXMub2MpZm9yKHZhciBiPTA7Yjx0aGlzLm9jLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMub2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnZ2KGIpfX0pfSkoYyk7dmFyIE1iPWMuZ218fE1iLHg9bmV3IE1iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJvPXRoaXMuYVs5XTt0aGlzLiRzPXRoaXMuYVsyXTt0aGlzLmxxPXRoaXMuYVs3XTt0aGlzLmZrPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVsxMF07dGhpcy50cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs4XX1jLkNsPWI7Yi5wcm90b3R5cGU9e1FvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sbzp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy5rcShhKX0sa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxxOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua286dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5DbHx8TmIsdmQ9bmV3IE5iKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZkLlFvKDQpOyhmdW5jdGlvbihjKXtjLnZpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCiRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxlYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgT2I9Yy52aXx8T2I7KGZ1bmN0aW9uKGMpe2Mud2k9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpPwp0aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLiR0fHwodGhpcy4kdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuQygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUGI9Yy53aXx8UGI7KGZ1bmN0aW9uKGMpe2MueGk9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgT2IoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgUGIoZSx0aGlzLkYpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5KKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5EYSlpZihhPT10aGlzLkRhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkRhW2IuaWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUWI9Yy54aXx8UWIsUmI9bmV3IFFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVqPXRoaXMuYVs3XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5WbD10aGlzLmFbNl07dGhpcy5lcT10aGlzLmFbNV07CnRoaXMuT3c9dGhpcy5hWzldO3RoaXMuaGs9dGhpcy5hWzVdO3RoaXMuV289dGhpcy5hWzldO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbN119Yy5wcT1iO2IucHJvdG90eXBlPXtEajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkVqOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVmw6dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVxOnRoaXMuTncoYSl9LE53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pdzp0aGlzLmdrKGEpfSxnazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaGs6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldvOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Pbjp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmN2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNiPWMucHF8fFNiLHdkPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdkLkRqKDQpOyhmdW5jdGlvbihjKXtjLmpsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVChiKTt0aGlzLlUoYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBUYj1jLmpsfHwKVGI7KGZ1bmN0aW9uKGMpe2MuaWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0P3RoaXMuQygpOmEueWEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LHRoaXMuQy5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVYj1jLmlsfHxVYjsoZnVuY3Rpb24oYyl7Yy5rbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IFRiKGJbZF0pLHRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IFViKGMsdGhpcy5GKSkuYygpKX19ZWxzZSB0aGlzLkooKX19KX0pKGMpOwp2YXIgVmI9Yy5rbHx8VmIsWT1uZXcgVmIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXY9dGhpcy5hWzFdO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLnZyPXRoaXMuYVszXTt0aGlzLmF4PXRoaXMuYVsxXTt0aGlzLldwPXRoaXMuYVs4XTt0aGlzLlhoPXRoaXMuYVs3XTt0aGlzLkVtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLkZpPWI7Yi5wcm90b3R5cGU9eyR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYXY6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlxOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLiR3KGEpfSwkdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXg6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLldoKGEpfSwKV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhoOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYj1jLkZpfHxXYix4ZD1uZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14ZC4kdSg0KTsoZnVuY3Rpb24oYyl7Yy5RbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxmYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZhKCl9LmJpbmQodGhpcyksNDAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBYYj1jLlFtfHwKWGI7KGZ1bmN0aW9uKGMpe2MuUG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5CZnx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuenF8fCh0aGlzLnRnKCksdGhpcy56cT0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5zKCk6dGhpcy5CZj8odGhpcy5vKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLnUoKSk6KHRoaXMuQmY9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSw1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLApmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLnBhPSEwLHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMudSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoKX0uYmluZCh0aGlzKSw1MCl9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuITB9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBZYj1jLlBtfHxZYjsoZnVuY3Rpb24oYyl7Yy5SbT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkJhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwppZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBYYihiLml0ZW0oYSkpO3RoaXMuSShjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IFliKGMsdGhpcy5GKSkuYygpKX10aGlzLkooKX19KX0pKGMpO3ZhciBaYj1jLlJtfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9dGhpcy5hWzNdO3RoaXMuWHI9dGhpcy5hWzJdO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMudmo9dGhpcy5hWzEwXTt0aGlzLmJ0PXRoaXMuYVszXTt0aGlzLk90PXRoaXMuYVszXTt0aGlzLktqPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzZdfWMuTXc9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkd0OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuWHI6dGhpcy5KdyhhKX0sSnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkt3OnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52ajp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBhYz1jLk13fHxhYyx5ZD1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15ZC5GdCg0KTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7CnRoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgYmM9Yy52a3x8YmM7KGZ1bmN0aW9uKGMpe2MudWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSwKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQ24oKX0uYmluZCh0aGlzKSksdGhpcy5JaD0hMSx0aGlzLkZ3PTFFMyx0aGlzLlRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSwkZjpmdW5jdGlvbigpe3RoaXMuVGcuZG9uZXx8Cih0aGlzLlRnLmRvbmU9ITAsdGhpcy5JaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGgoKX0uYmluZCh0aGlzKSx0aGlzLkZ3KSl9LENuOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkloKTt0aGlzLnMoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkMoKSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LApBYTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuZ2cobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5nZyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgY2M9Yy51a3x8Y2M7KGZ1bmN0aW9uKGMpe2Mud2s9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7CndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5IYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkhhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBiYyhjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBjYyhjLHRoaXMuRikpLmMoKSkpfX10aGlzLkooKX19KX0pKGMpO3ZhciBkYz1jLndrfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzldO3RoaXMubD0KdGhpcy5hWzFdfWMuR2s9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1sOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgZmM9Yy5Ha3x8ZmMsemQ9bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emQubGwoNCk7KGZ1bmN0aW9uKGMpe2MuYW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBnYz1jLmFtfHxnYzsoZnVuY3Rpb24oYyl7Yy4kbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMucygpLHRoaXMuZ2EoKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKSk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk7dGhpcy4kYigpfSwkYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLnBlKCkmJgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGUoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGIoKX0uYmluZCh0aGlzKSwxMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYz1jLiRsfHxoYzsoZnVuY3Rpb24oYyl7Yy5ibT1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBnYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgaGMoYix0aGlzLkYpKS5jKCkpfXRoaXMuSigpfX0pfSkoYyk7dmFyIGljPWMuYm18fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVsxXX1jLiRoPWI7Yi5wcm90b3R5cGU9e0xwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLmw6YX19fSkoYyk7dmFyIGtjPWMuJGh8fGtjLEFkPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFkLkxwKDQpOyhmdW5jdGlvbihjKXtjLlFsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkVlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5jdSgpfS5iaW5kKHRoaXMpLDUwMCl9LGN1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmCmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLkVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLkVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LGR2OmZ1bmN0aW9uKCl7dGhpcy5FZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIGxjPWMuUWx8fGxjOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5RYj0wfSxjOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuUWJ8fCh0aGlzLlFiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpOih0aGlzLlFifHx0aGlzLlFiKyssdGhpcy5RYjw9dGhpcy5Bcz8odGhpcy5RYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuZHYoKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIG1jPWMuUGx8fG1jOyhmdW5jdGlvbihjKXtjLlJsPXIuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBsYyh3aW5kb3cucGxheWVyQXBpKSx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBtYyhiLHRoaXMuRikpLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIG5jPWMuUmx8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qaz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbOF07dGhpcy5Daj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbMV07dGhpcy51dD10aGlzLmFbMTBdO3RoaXMuU2k9dGhpcy5hWzVdO3RoaXMuRXQ9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy5Bbz1iO2IucHJvdG90eXBlPXtpazpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmprOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy5PdihhKX0sT3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlB2OnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eazp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnV0OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5TaTp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRXQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBwYz1jLkFvfHxwYyxCZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQmQuaWsoNCk7KGZ1bmN0aW9uKGMpe2MuTmw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5UKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7CmIuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgcWM9Yy5ObHx8cWM7KGZ1bmN0aW9uKGMpe2MuTWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkueWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5ycCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmFkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5ycygpOnRoaXMuJGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSxycDpmdW5jdGlvbigpe3RoaXMuc2YoKXx8dGhpcy51KCEwKX0scnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmFkKCk7IWIuc2EmJmIuWCYmYi5meCYmYi5oeCYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LCRiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmdhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRiKCl9LmJpbmQodGhpcyksMTAwKX0sYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5QZylmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkueWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuUGc9YltjXSk7cmV0dXJuIHRoaXMuUGd9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5hZCgpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciByYz1jLk1sfHxyYzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBxYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgcmMoYyx0aGlzLkYpKS5jKCkpfXJldHVybn19dGhpcy5KKCl9fSl9KShjKTt2YXIgc2M9Yy5PbHx8c2MsdGM9bmV3IHNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naT10aGlzLmFbOF07dGhpcy5CcD10aGlzLmFbMl07dGhpcy5Fbz10aGlzLmFbNV07dGhpcy5sbj10aGlzLmFbN107dGhpcy5ubj10aGlzLmFbNV07dGhpcy5ycj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlN1PWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5naTp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnA6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMua24oYSl9LGtuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubm46dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgdWM9Yy5TdXx8dWMsQ2Q9bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNkLmZpKDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtFJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVChiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5VKGEpOnRoaXMuaWEoKX1lbHNlIHRoaXMuaWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuVmt8fFo7KGZ1bmN0aW9uKGMpe2MuVWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuR2U9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuR2U9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5HZSYmYiE9dGhpcy5HZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLkZ4KSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuVWt8fGFhOyhmdW5jdGlvbihjKXtjLldrPQpyLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBhYShiLHRoaXMuRiksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLmxhP3RoaXMuTWUoKTp0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgYWEoYiwKdGhpcy5GKSxiLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRSx2Yz1jLldrfHx2Yyx3Yz1uZXcgdmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC5zYi5sZW5ndGgpe3ZhciBhPWwuc2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuSXUoeyJbTE9BRFNDUklQVF0iOmUua2EoMTApLCJbVVRJTFNdIjplLmthKDEwKSwiW0NBTExCQUNLXSI6ZS5rYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuRmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLkZnKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2o9dGhpcy5hWzRdO3RoaXMuJG49dGhpcy5hWzNdO3RoaXMuZG09dGhpcy5hWzZdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWXM9dGhpcy5hWzZdO3RoaXMuanM9dGhpcy5hWzEwXTt0aGlzLkZrPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMuV3M9YjtiLnByb3RvdHlwZT17Rmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdqOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG06dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpuOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zczp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6CnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRms6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgeGM9Yy5Xc3x8eGMsRGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGQuRmooNCk7KGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlQoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuTHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9ZWxzZSB0aGlzLmlhKCl9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuSmQ9Yn0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Mc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSwKZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuYWIoYil9LmJpbmQodGhpcykpfSxhYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkpkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5KZCYmKG5ldyBIKHRoaXMsdGhpcy5KZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLnZtfHxOOyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5hZSlpZih0aGlzLmxifHwodGhpcy5sYj0wKSx0aGlzLmxiKyssMTU8dGhpcy5sYil7aWYod2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuS3UoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmFlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpOwp0aGlzLkFhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuViksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYSgpfS5iaW5kKHRoaXMpLDEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIPWMudW18fEg7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMuQmE9LTF9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPQpuZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubGF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEgoYix0aGlzLkYpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5sYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQXUodGhpcy5GKSxiPW5ldyBIKGIsdGhpcy5GKSxiLmMoKSkpO3RoaXMuSigpfX0pfSkoYyk7dmFyIHljPWMud218fAp5Yyx6Yz1uZXcgeWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3U9dGhpcy5hWzldO3RoaXMuT2k9dGhpcy5hWzFdO3RoaXMuR209dGhpcy5hWzVdO3RoaXMuU3Q9dGhpcy5hWzNdO3RoaXMuUnY9dGhpcy5hWzJdO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLnBqPXRoaXMuYVs4XTt0aGlzLmNzPXRoaXMuYVs0XTt0aGlzLkVsPXRoaXMuYVszXTt0aGlzLlFwPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnBwPWI7Yi5wcm90b3R5cGU9e1Z1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5XdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5TdDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlJ2OnRoaXMuVHcoYSl9LFR3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vdzp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGo6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNzOnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYz1jLnBwfHxBYyxFZD1uZXcgQWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FZC5WdSg0KTsoZnVuY3Rpb24oYyl7Yy5Qaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmR1cmF0aW9uPXRoaXMuT2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmlhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse1lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuT2Y9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntZbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIEJjPWMuUGt8fEJjOyhmdW5jdGlvbihjKXtjLk9rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEp4OmZ1bmN0aW9uKCl7fSxsdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLmZmKG5ldyBmdW5jdGlvbigpe30pO2EuY3g9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHUoYSk7d2luZG93Lmt4PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmt1fHwodGhpcy5rdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmllfHwodGhpcy5pZT0xKTtpZigyMDx0aGlzLmllKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkxhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuaWUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LExhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLlooKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5aKCEwKX0uYmluZCh0aGlzKSl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubygiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTticmVha319LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuWighMCl9LmJpbmQodGhpcykpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/Cih0aGlzLnMoKSx0aGlzLmdhKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3RoaXMuQyhiKX19KX0pKGMpO3ZhciBDYz1jLk9rfHxDYzsoZnVuY3Rpb24oYyl7Yy5Raz1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgQmMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmxhfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBDYyhjLHRoaXMuRikpLmMoKSl9dGhpcy5KKCl9fSl9KShjKTt2YXIgRGM9Yy5Ra3x8RGMsRWM9bmV3IERjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcz10aGlzLmFbNF07dGhpcy5ldT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsyXX1jLlRuPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBGYz1jLlRufHxGYyxGZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GZC5kcyg0KTsoZnVuY3Rpb24oYyl7Yy5Laz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKTthJiZ0aGlzLlQoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYmE9Yy5La3x8YmE7KGZ1bmN0aW9uKGMpe2MuSms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucGc9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucGE9dGhpcy5sYz10aGlzLlhhPXRoaXMuSmM9ITE7dGhpcy5ZZz1lLnBiKDEwKTt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnNhPQpiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuTGEoKSwhMDt0aGlzLnBnKys7aWYoMTA8dGhpcy5wZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy51KCEwKTp0aGlzLnUoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhnLmJpbmQodGhpcyksMTAwKSwhMX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNhO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWighMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09CmEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy51YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMudWEoKTsKYnJlYWt9fSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhfSx1YTpmdW5jdGlvbigpe3RoaXMucGE9ITB9LFo6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCk/KHRoaXMucygpLHRoaXMuZ2EoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuQyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgY2E9Yy5Ka3x8Y2E7KGZ1bmN0aW9uKGMpe2MuTGs9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPQowO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IGNhKGIsdGhpcy5GKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBjYShiLHRoaXMuRiksYi5jKCkpKTt0aGlzLkooKX19KX0pKGMpO3ZhciBHYz1jLkxrfHxHYyxIYz1uZXcgR2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzNdO3RoaXMuWmw9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzVdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuUG89CnRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuTHc9YjtiLnByb3RvdHlwZT17JHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5abDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXU6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnh0OnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEljPWMuTHd8fEljLEdkPW5ldyBJYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HZC4kcig0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5UKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmlhKCkpOnRoaXMuaWEoKTp0aGlzLmlhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxmZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTsKdmFyIEpjPWMuc2p8fEpjOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLAp0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2M9Yy5yanx8S2M7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuSGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9CmJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgSmMoZCksZC5sYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgS2MoZCx0aGlzLkYpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5KKCl9fSl9KShjKTt2YXIgTGM9Yy50anx8TGMsTWM9bmV3IExjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLm5pPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzJdfWMuWXE9YjtiLnByb3RvdHlwZT17SnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkt0OnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5jPWMuWXF8fE5jLEhkPW5ldyBOYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IZC5KdCg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVChiKSx0aGlzLlUoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5pYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBPYz1jLnpqfHxPYzsoZnVuY3Rpb24oYyl7Yy55aj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GZigpfSwKRmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZmKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBQYz1jLnlqfHxQYzsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgT2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubGEpe3RoaXMuSigpO3JldHVybn1pZighdGhpcy5JKGIpKXt0aGlzLkwoYik7KG5ldyBQYyhiLHRoaXMuRikpLmMoKTt0aGlzLkooKTtyZXR1cm59fXRoaXMuSigpfX0pfSkoYyk7dmFyIFFjPWMuQWp8fFFjLFJjPQpuZXcgUWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMuWXY9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLkN0PXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzFdfWMuQXI9YjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIFNjPWMuQXJ8fFNjLElkPW5ldyBTYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JZC51big0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy56Zz10aGlzLkNnPXRoaXMuQmc9ITE7dGhpcy5sZD1bXTt0aGlzLkplPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBSYz9udWxsOlJjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBIYz9udWxsOkhjLHRvbmxpbmU6InVuZGVmaW5lZCI9PT10eXBlb2YgTWE/bnVsbDpNYSxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRjP251bGw6dGMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSwKdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpjP251bGw6emMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVjP251bGw6RWMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdiP251bGw6R2IsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1jP251bGw6TWMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBrYj9udWxsOmtiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyx3ZnY0OiJ1bmRlZmluZWQiPT09CnR5cGVvZiAkYj9udWxsOiRiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFdhP251bGw6V2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2E/bnVsbDpzYSxUT25saW5lMkRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYT9udWxsOlJhLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBZP251bGw6WX19Yy5KbD1iO2IucHJvdG90eXBlPXtjOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlJxKGEpOltdLGI7dGhpcy5DZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5CZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5iaChiKX1lbHNlIGZvcihjIGluIHRoaXMuSmUpe2lmKHRoaXMuemcpYnJlYWs7Yj10aGlzLkplW2NdO3RoaXMuJGUoYikmJih0aGlzLmxkLnB1c2goYiksdGhpcy5iaChiKSl9fSwkZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiByPyEwOiExfSxScTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5KZVtjXSx0aGlzLiRlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGJoOmZ1bmN0aW9uKGEpe3RoaXMuJGUoYSkmJmEuYygpfSxldjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuQmcpZm9yKHRoaXMuemc9ITAsYT0wO2E8dGhpcy5sZC5sZW5ndGg7YSsrKXRoaXMubGRbYV0udWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sZFthXS51Yil9fX0pKGMpO3ZhciBUYz1jLkpsfHxUYyxMPW5ldyBUYztMLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5laj10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLmhqPWI7Yi5wcm90b3R5cGU9e2RqOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLmhqfHxVYyxKZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KZC5kaig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksCmUuZWMoay5adiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuZWMoay5PcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgS2Q9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgRz1uZXcgUixtPSExO0cubWMoKTtHLnVnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5tYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcudWcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7Ry5tYygpO3ZhciBMZD1LZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkxyKCkse2lkOkxkfSl9LDUwMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs0XX1jLnl0PWI7Yi5wcm90b3R5cGU9e0JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Dcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIFZjPWMueXR8fFZjLE1kPW5ldyBWYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1kLkJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5WZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuZ2Q9CjA7dGhpcy5PYT0iIjt0aGlzLm1kPVtdO3RoaXMubmQ9MDt0aGlzLlhnPSExO3RoaXMuSGU9W119Yy5LaD1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbihhKXt0aGlzLlZnPWF9LHBkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5PYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ3U6ZnVuY3Rpb24oYSl7dGhpcy5XYT1hfSxCdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0seGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk9hXSYmdGhpcy5jb25mW3RoaXMuT2FdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5PYV1bYV0pO3JldHVybiBifSxzYzpmdW5jdGlvbihhLGIpe2UubmIoIndlbHQuZGUiKSYmZS5OYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMuV2EuZih0aGlzLldhLmNkLHRoaXMuV2EudmEsdGhpcy5XYS5JZSxmdW5jdGlvbigpe3RoaXMuc2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLldhLlVjKTtlbHNlIGlmKHRoaXMuanIoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5zYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuUmMsdGhpcy5wbGF5ZXIudigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuaHYoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLmZoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PQp0eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy56cyhhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIucWUmJihjPXRoaXMucGxheWVyLnFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnNlKGEsYyxmKTt0aGlzLnBsYXllci5naChsKX19LE1yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuZ2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5nZC5nZXRUaW1lKCksdGhpcy5nZD1hLDNFNTxiPyEwOiExO3RoaXMuZ2Q9YTtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtlLk9lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy54YSgiYWRUYWciKTt0aGlzLnhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy54YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuV2YoYSkpPwp0aGlzLnNjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfSxRdTpmdW5jdGlvbihhKXtlLk9lKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlZnKXt0aGlzLkh1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy54YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLldmKGMpKT90aGlzLnNjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5TYyx0aGlzLnBsYXllci52KCkpKX19LFdmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxudTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk11KHRoaXMuUXUuYmluZCh0aGlzKSk7CnRoaXMucGxheWVyLmZhKCl9LHNkOmZ1bmN0aW9uKGEpe2UuT2UoIm1pZHJvbGwiKTtpZighdGhpcy5IZyl7dGhpcy5IZz0hMDt2YXIgYj10aGlzLnhhKCJhZFRhZyIpO3RoaXMueGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5zYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZz0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGUudyhrLlNjLHRoaXMucGxheWVyLnYoKSkpfX0sbXU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HdSh0aGlzLnNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLndlKCl9LGM6ZnVuY3Rpb24oKXt0aGlzLlJ1KCk7dGhpcy5wbGF5ZXIud2UmJnRoaXMubXUoKTt0aGlzLm51KCl9LG91OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7CmZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLm1kLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5TdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMubmQ9dGhpcy5tZC5sZW5ndGh9LGpyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLm5kJiYoYT0hMCk7cmV0dXJuIGF9LHZ1OmZ1bmN0aW9uKGEpe3RoaXMuWGc9YTtmb3IoYT0wO2E8dGhpcy5tZC5sZW5ndGg7YSsrKXRoaXMubWRbYV1bImZ1bmN0aW9uIl0odGhpcy5odS5iaW5kKHRoaXMpKX0saHU6ZnVuY3Rpb24oYSl7dGhpcy5uZC0tO2EmJnRoaXMuSGUucHVzaChhKTswPj10aGlzLm5kJiZ0aGlzLlhnKCl9LHpzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLkhlLmxlbmd0aDtjKyspYj10aGlzLkhlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7CnJldHVybiBhfX19KShjKTt2YXIgamE9Yy5LaHx8amEsUz0hMSxvYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zbD10aGlzLmFbNF07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5Ubz10aGlzLmFbNF07dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5ZcD10aGlzLmFbMTBdO3RoaXMuR3I9dGhpcy5hWzRdO3RoaXMuZnc9dGhpcy5hWzZdO3RoaXMuTHY9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbNV19Yy5sbz1iO2IucHJvdG90eXBlPXtybDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc2w6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFrOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ubzp0aGlzLkhrKGEpfSxIazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWs6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ZcDp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR3I6dGhpcy5ldyhhKX0sZXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ3OnRoaXMuS3YoYSl9LEt2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTHY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLmxvfHxXYyxOZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OZC5ybCg0KX0pLmNhbGwoaWVab29rZWlFZXBoZVRoaSxpZVpvb2tlaUVlcGhlVGhpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.131.55 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.55.131.251.148.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=001002a8e6b485cc15c5dd757:1579721048212:1549653848212:.golem.de:1:1549653848212!ckm92e; __utma=21769261.279128799.1549653848.1549653848.1549653848.1; __utmc=21769261; __utmz=21769261.1549653848.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1549653848; golem_us=e993019f; golem_uv=e993019f; golem_uz=e993019f; __io=940ff91d9.8a31a7f20_1549653848561; __io_unique_43098=8; __io_uh=1; __io_visit_43098=1; __gads=ID=7d858f55e451bd6e:T=1549653848:S=ALNI_MbR-VLuzBQBJcfgrnGBaysEdU7OBg
Connection
keep-alive
Content-Length
371
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 08 Feb 2019 19:24:11 GMT
Server
TornadoServer/4.5.3
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
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame BED3
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
KTPCACOOKIE=YES; KADUSERCOOKIE=11110396-BB71-4608-B642-001C945E1EC6
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Last-Modified
Thu, 15 Nov 2018 04:53:43 GMT
ETag
"13006b6-9ed1-57aacd5c8da70"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
15271
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=74278
Expires
Sat, 09 Feb 2019 16:02:09 GMT
Date
Fri, 08 Feb 2019 19:24:11 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 7F76
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_256_GCM
Server
2.18.232.130 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
icu=ChgIyKZXEAoYASABKAEw2q734gU4AUABSAEQ2q734gUYAA..; uuid2=8408649297750833922; anj=dTM7k!M4.FErk#WF']wIg2GVLrct:P!]tbPl1N!7Qhn_4=0QmDgwoT2.Bpq5kk``$4A@yWdHoIy0s6m.jPb<$ci0n2b)pac/tI1W6$Hh<!_6-z!>TJW:3!?k
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Sat, 08 Feb 2020 19:24:11 GMT
Date
Fri, 08 Feb 2019 19:24:11 GMT
Connection
keep-alive
pd
eu-u.openx.net/w/1.0/ Frame B1C2
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_ECDSA, CHACHA20_POLY1305
Server
173.241.240.143 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-143.xa.dc.openx.org
Software
OXGW/16.121.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=e7e382e5-9b8c-0471-1632-e865530fb1bf|1549653848
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept
set-cookie
i=e7e382e5-9b8c-0471-1632-e865530fb1bf|1549653848; Version=1; Expires=Sat, 08-Feb-2020 19:24:11 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1549653851|mOgikimWiygu; Version=1; Expires=Sat, 23-Feb-2019 19:24:11 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.121.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Fri, 08 Feb 2019 19:24:11 GMT
content-type
text/html
content-encoding
gzip
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFINOBATkzF6ZBAAOA55A55A85B55A58E55A55AGAywAz1Ay5Ar1ZoAPrAAhPAqABH1ZoASksFsCdhPAqABtEA6DAFAAA1ZoAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAzxAvoE0tFsvBjvFu0FhpFulFyuBo0FtsFPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFMecXSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:12 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:11 GMT
data
lb65.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb65.s400.meetrics.net/data?/rkiFJh3BA/k0F6PmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9yA41A20A41A1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zA55AxzA21AymAjpFk9BxzA4yA14A01A1zA20AmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A5zA55AxzA21AymAhwFk9B05Az5A5xAz2A1yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay1A41A3zA54A4mAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mFvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9zAwwA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FLlnFETkzFARksFAQtjFT/XmYA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:15 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 08-Feb-19 19:24:14 GMT
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953

Request headers

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

Response headers

x-amz-version-id
dik4fw73nQhdvjIqconVQLveJfnZMGnt
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 03:03:26 GMT
Server
AmazonS3
x-amz-request-id
BCB58BD69A229C12
ETag
"0253570faeffb9f0f2478d761e0edfa7"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 08 Feb 2019 19:24:16 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5428
x-amz-id-2
I3d69+CMcDEDV1HA05qHi1ckgmxbFfcHbdVSPEZg+qvmKYm528W/wF2xpu1MGW9JO8DnGdhymUo=
adex.js
dmp.theadex.com/d/607/2256/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/607/2256/s/adex.js?ts=31420622
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
89.163.159.117 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
7e93e57c5fca59d7f6d192261b7b82bc50db5128bab9a768699398b2e3e8bab3

Request headers

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

Response headers

date
Fri, 08 Feb 2019 19:24:16 GMT
content-encoding
gzip
last-modified
Thu, 31 Jan 2019 19:24:07 GMT
server
nginx
etag
W/"5c534b57-9c4e"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 08 Feb 2019 19:29:16 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.119 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn1.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:17 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 18:52:32 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 15 Feb 2019 07:04:33 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.228.50 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-228-50.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:16 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1543
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
673 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=56542981&src.id=Stroeer
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.67.216 Cambridge, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-185-67-216.eu-central-1.compute.amazonaws.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:16 GMT
Server
Apache
P3P
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Type
image/gif;charset=UTF-8
Content-Length
43
X-Application-Context
application
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p.min.js
cdn.emetriq.de/adp/profiling/0.2.1/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.1/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:200d:cc00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d

Request headers

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

Response headers

date
Thu, 13 Dec 2018 13:56:26 GMT
content-encoding
gzip
last-modified
Thu, 13 Dec 2018 13:47:28 GMT
server
AmazonS3
age
4944472
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
hiWj6aE8JHqtrvyMwCZ_m8sYL51hXzoR
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
T2vGkWd3WLAvvsmiMc4JWjzrSoGHUEislQp7RQkb57HjBqy7PAwKLw==
via
1.1 affe26bf02a36a4a45ea1eb3ce2b4a62.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_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&mbr=e9f7e30eaec7a49a8083ef2bc5e6e500&event_id=page_view&_sid=69511&_ver=0.2.1&_seg=jsonp&_=341129062737
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.228.50 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-228-50.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
81cbcad7932114f5a824b65988df6327356a6124528e4d76e1ac4b54e887805b

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:16 GMT
Content-Encoding
gzip
Server
Apache-Coyote/1.1
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
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1782
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
34.252.169.181 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-169-181.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Wed, 06 Feb 2019 08:21:31 GMT
Content-Encoding
gzip
Last-Modified
Wed, 06 Feb 2019 08:21:16 GMT
Server
akka-http/10.1.7
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/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001819792024170135&axd_pid=22&axd_fuid=BSa8ESw0BsJ0WsU8Eif-BiUABifkBSfZWsfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3...
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1001819792024170135
42 B
832 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=1001819792024170135
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.254.7.51 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-254-7-51.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:16 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
42

Redirect headers

status
302
date
Fri, 08 Feb 2019 19:24:17 GMT
access-control-allow-credentials
true
server
nginx
p3p
CP="CAO PSA OUR"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=1001819792024170135
content-type
text/html; charset=UTF-8
segments
api.theadex.com/v0.9/pub/
140 B
210 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.125 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe

Request headers

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

Response headers

status
200
date
Fri, 08 Feb 2019 19:24:17 GMT
content-length
140
content-type
text/plain; charset=utf-8
activation
adstax-match.adrtx.net/ Frame AC3D
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.127.173 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-127-173.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 08 Feb 2019 19:24:17 GMT
Server
akka-http/10.1.7
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
832 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=e9f7e30eaec7a49a8083ef2bc5e6e500
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.254.7.51 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-254-7-51.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

Date
Fri, 08 Feb 2019 19:24:17 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
/
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:6]&s=6acc7c777cce3be138a245218c439c54&1549653858613
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 08 Feb 2019 19:24:18 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Failed requests

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

Domain
www.googletagservices.com
URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914

Verdicts & Comments Add Verdict or Comment

163 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| onselectstart object| onselectionchange function| queueMicrotask object| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| fXm_Head object| SDM_head undefined| SDM_resource string| SDM_target object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| de_meetrics object| yieldlove_site_settings object| YLHH object| yieldlove_cmd function| pbjsYLHHChunk object| __core-js_shared__ string| logLevel object| clrm object| stroeerCore object| GPT_jstiming boolean| google_measure_js_timing object| google_reactive_ads_global_state function| $ function| jQuery object| iAbo function| golemAcceptCookies object| NUGGjson string| n_pbt object| _m6rq boolean| deliveringAds boolean| subDomainCheckVar function| RLLYdd object| rllly069Flags string| rllly480Rnd object| rlllydc12tc string| szmvars object| iom object| iam_data object| _io_config string| disableStr object| _gaq function| setUpAgknTag boolean| rllly533sdl boolean| rllly533sdln string| rlllydc12genat string| rlllydc12sthash boolean| rllly496forceimp boolean| rllly3e5newinject boolean| rlllyac7Body boolean| rlllyaf3Detect object| rlllydc121 object| rlllydc12o1 object| rlllydc12o2 object| rlllydc12o3 object| rlllydc122 number| rlllydc12d3 object| rlllydc124 object| rlllydc125 boolean| rlllyc50ij object| adsbygoogle object| _gat object| gaGlobal function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet number| _m6rApiLoaded function| Swiper object| google_ad_modifications object| google_sa_queue object| google_sl_win function| google_process_slots function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| rmp3pi function| SwfVideo object| exportz object| f object| __io object| _m6rOnce number| _m6rContainerLoaded boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id object| rllly77aMobile function| stroeerCoreConnect function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| google_pub_config 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 function| Goog_AdSense_OsdAdapter string| _io_uniques_holing_params object| core object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| ieZookeiEepheThi string| D object| ox object| Ax function| videopkgInterface object| oms_debug string| sdm_ift boolean| rlllyc31Track 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_172931 object| closure_lm_72601 string| hic_qos function| _h object| _adexc object| adex object| _EQLService object| _EQPScript object| _EQPService object| _emqAdexGif object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| ibb_lib

19 Cookies

Domain/Path Name / Value
.mathtag.com/ Name: uuidc
Value: WpvSLd5md+ZmO0N1Ke4Hliv4FhlfZ7zwvQQYX602BdrT65HmrrnUv7ALE4JTboIMXq638toxPpOYy+QV8QdO+vYckXJVxgcAvo5SeDS0FeM=
.adform.net/ Name: uid
Value: 2971362142136899153
.pubmatic.com/ Name: KADUSERCOOKIE
Value: E0C949DF-18B6-4F64-9E9D-2A4EA4BA17A5
.pubmatic.com/ Name: KRTBCOOKIE_1051
Value: 22884-18072662431857770106
.pubmatic.com/ Name: KRTBCOOKIE_466
Value: 16530-dd81451a-725b-4a46-9cba-cfbdfed23644&KRTB&16532-dd81451a-725b-4a46-9cba-cfbdfed23644
.pubmatic.com/ Name: SPugT
Value: 1549653855
.pubmatic.com/ Name: KRTBCOOKIE_153
Value: 19420-NkMPGWcXDxkuEl5EYBMXGzJEXkwuFgsbZkKlhkqh&KRTB&22979-NkMPGWcXDxkuEl5EYBMXGzJEXkwuFgsbZkKlhkqh
.pubmatic.com/ Name: KRTBCOOKIE_336
Value: 5844-7688167460501950998
.pubmatic.com/ Name: KRTBCOOKIE_80
Value: 16514-CAESEB5LPn_sXRRdMZZQ7sFpEiA&KRTB&22987-CAESEB5LPn_sXRRdMZZQ7sFpEiA&KRTB&22995-CAESEB5LPn_sXRRdMZZQ7sFpEiA&KRTB&23025-CAESEB5LPn_sXRRdMZZQ7sFpEiA
.pubmatic.com/ Name: KRTBCOOKIE_391
Value: 22924-2971362142136899153
.pubmatic.com/ Name: KRTBCOOKIE_22
Value: 14911-2916383075371733038&KRTB&16087-2916383075371733038&KRTB&23049-2916383075371733038
.pubmatic.com/ Name: KRTBCOOKIE_18
Value: 22947-639863007839567680
.mathtag.com/ Name: uuid
Value: e2865c5d-d549-4500-90ba-78cf5e1fdd50
.pubmatic.com/ Name: PUBMDCID
Value: 3
.pubmatic.com/ Name: KRTBCOOKIE_218
Value: 4056-XF3XXAAAAFlmmUTr&KRTB&22922-XF3XXAAAAFlmmUTr&KRTB&22978-XF3XXAAAAFlmmUTr
.pubmatic.com/ Name: PugT
Value: 1549653856
.pubmatic.com/ Name: KRTBCOOKIE_377
Value: 6810-82d06c33-af78-462c-9c92-b2205ef9a27b&KRTB&22918-82d06c33-af78-462c-9c92-b2205ef9a27b&KRTB&23031-82d06c33-af78-462c-9c92-b2205ef9a27b
.doubleclick.net/ Name: IDE
Value: AHWqTUnfDo9URFF-TbjK-U46GCDZ6cM0hbEAxPJxdKblVssylVXSzGT9I_IWfzda
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImtkQzgiLCJ0c2wiOjE1NDk2NTM4NTcsIm52IjowLCJ1cHQiOjE1NDk2NTM4NDcsImx0IjoxNTQ5NjUzODQ3fV0.

2 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api error URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019020401.js(Line 1)
Message:
TypeError: Cannot read property '0' of null

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=11001100; 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
ads.pubmatic.com
adscale.nuggad.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
api.theadex.com
bbcdn-bbnaut.ibillboard.com
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cm.g.doubleclick.net
cpx.golem.de
cpxl.golem.de
d.agkn.com
de-gmtdmp.mookie1.com
de.ioam.de
dmp.theadex.com
eu-u.openx.net
golem.de
googleads.g.doubleclick.net
hb.adscale.de
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb65.s400.meetrics.net
pagead2.googlesyndication.com
prg.smartadserver.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
script.ioam.de
securepubads.g.doubleclick.net
servedby.flashtalking.com
si.nuggad.net
ssl.1.damoh.golem.de
ssl.3.damoh.golem.de
ssl.google-analytics.com
stats.g.doubleclick.net
tpc.googlesyndication.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.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
www.googletagservices.com
136.243.3.97
142.93.164.163
148.251.0.183
148.251.131.55
172.217.16.162
173.241.240.143
173.241.240.220
18.185.67.216
184.30.220.71
185.33.223.216
185.64.189.112
185.86.139.19
2.16.122.151
2.18.232.130
2.18.233.180
2.18.233.67
2.18.234.72
2.19.33.59
205.185.216.10
216.58.208.34
2600:9000:200d:3800:15:efbc:e300:93a1
2600:9000:200d:cc00:1c:8c89:a300:93a1
2606:4700:30::6818:6724
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:808::200a
2a00:1450:4001:809::2002
2a00:1450:4001:816::2002
2a00:1450:4001:819::2001
2a00:1450:4001:819::2002
2a00:1450:4001:81b::2002
2a00:1450:4001:81b::2008
2a00:1450:4001:821::200e
2a00:1450:400c:c08::9a
2a00:1450:4016:80d::2006
2a02:26f0:6c00:189::5f76
34.252.169.181
34.254.7.51
52.208.127.173
52.216.10.45
52.28.163.57
52.31.228.50
52.86.164.68
54.230.93.134
54.230.93.94
62.168.44.119
77.247.84.129
77.247.84.149
80.82.201.88
89.163.159.112
89.163.159.117
89.163.159.125
91.215.100.39
91.215.100.40
95.216.24.148
0096b27352f1c27645b5e29aed423ea948d0f27319be7a86dab5333d0792f83f
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe
044732b2ed3d6c2866928c6aecc2421d9d4826465eb2459f83ec922a4fcebe30
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0609b951fd9f92aa5e2c24354a25e9bc1351c05642323dd926fc612b7413baa4
063cbf4a3405b0c010273a8bf895cc2cadd27abe0792d9d1f0ba0928f786b998
06f2d536523ad5a938ec4ab66d891e6498b4a1a851679a7fd68fabcdecc9dd75
07f489067707b27cb4f3adcd75497091b1d0da19b9155042542c3995ac45a8c9
090e40ad508a33afdc4d20efb3e4871b3099ef574b03cf1ad16e0ac31f005589
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
1140fd4da378b7e5db283620fc0810c86ae3a207615405b298849705205c2870
11a4f1849f3313f40aba1b253da1a8604197176c10fd68a94f106ee341e1e6fd
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
15c878b8a80454305b10f9ce86823000c153c59e7b692b96e23be7e387403be3
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
1a78a63c292f0ea293e23ca26d892db126a30d954222cb3359a8daa132c085d1
1b2e6a51b671e12d41d5617a0051365383b54f01f4bebbff7d97e45bc4d0b350
1b6ce0604a2410f838abe06afdb2a5c0c8c41cf7a47a534a9b47d3ded1e7fb70
1ba08df633f3e0eebcdf391b73904780323122eb03d45ca8990a70f8a6d938c7
1cb02a39c377c012fc18cb3c52bf5f17d77253aa33e50d15ab0ce10407ecf520
1d93f6aa64d0f596f676e2660dce621ab5a5e1f3077890075d1386f7307dd763
1decdc030a196deb840030e5e5feca23b3730aca34329be00ac872d50041f96d
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
21d3ecf4c3c0d4d6e57d71c8e83bf6d8845d988ef58224ee2047437be34dd14c
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
2a0cc2f9a8f5cf7011c49314189debe5165338fb4f373806371c339ae5fdbd09
2e34b4c0baacbe84542103b107ea2d1771b75aae6e15c15b46088d596ced6292
2f4bdb9f287ec32f91fe0d396715fb99889cf89c5912a4ee8143e5a74410452e
30bbcc667eb9bffbb14462a7483c5da0a13873b20dfc60187de666b5be5251b3
31e2a9f454552b7412a580653be630b1c3d1a8e148617c96d43e26dbcdbd44d4
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33664693ea7d566b564d9ca99a7644d3d1d83a8bcf485cefe7fccb895e7037e9
338080e9326f7e5fffc59dacebef59b51a74b8334d85f101fc0673d0599625fe
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
34f0850833ea2339f61d17475c7d5d228be8f1f56fd3f836ccb72f30fb9c75d4
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
3640f8756f5fc7dafa1151a23255b75d69d383f65164bb039e378ac75d0875f1
3bd5243ad6ba963e62724f92d5b7a4369cb3ef4f465b2afb4411c958fb16bad6
3bdfb8c773a8465b93159b86419d39d02a237ae0677f5a05735cd4885f5f30b3
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
472999f69982a9d8f7e3961d221a923e14005658bd802d43b1741a8c6ae03ddd
47593998f1b54a63b94bd293ae7113ce1f15d5feb3050fdb07fc0d9c917c2d2a
482866dfff8b35edec7f2d9000b1a6a600015ea168e0d3939840226928237f34
4971c47346b2590bcd2db1c5b4f6a0577de034ef8e946a61b49bed6d7955ea52
4a1485181308d9761919d54c30a97edbd2730f8b8a314540464d895fda83b372
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
5828a86e25bdf5e71ab087fdb26114a27776475d0047f5e4d2618cdaac89eaa9
5857a9b5acd2847fe72d2f92cc05c783fced58f86b86d64b594568556bf11ff8
590c096c9b4ba9b63d1b6178f6ede3f65291382f3d2521a61470e00697b17417
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5a890063680acbda864c949d5da1a1b0da6e91fcc991b87ced245bbd43b58447
5c327d2a8b831e9ae35540a9b163485242b84429247cf8d69608eea506d97987
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5c64bd3e408892fb14bca8aee04daaafecfd41c095c4104890145b76733f004e
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed
61d0ad5890c09b5e46ab949757c1c79d134cfe12799be9569f5b47f02b1666b8
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6efecc5b7aaa0fab574959f9f8fdf2bbdb482ebb285bcbbb259c5d7e060c8b34
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
769edb4f2042dedb4b17c881d89372431817ff8f5525fbc225a2e817164d69c6
772936df0f7b91673c2c52dbd0f83f9382d8ad1218a620bbb453cb8a0e3ea251
77c9333e464ab137a9740e202a30bed96b6313aaacdf9807af403b8bed9f2991
78c3e5a54296560caf960f67bb3f6b57688027079ce303406935bcab39694c8f
7a032e17dad6979c2378055346b60f77465a08cb4750d475d0ce104bcbaf45d8
7a9c057de0f641b2b9a094f9f198598b1130ae5e4c92a2fe7bc6a9df1fe5ec3a
7d6094828306f021a5dbeac0442102b2c415466065172be558a0907065f95ae7
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
7e93e57c5fca59d7f6d192261b7b82bc50db5128bab9a768699398b2e3e8bab3
7f4c79ef3b9ad8186e44d5f06491aa0947af98f0e68c07708f900f57a5f2e141
80c137727b2f7d6cdf51ce10bfc5a283c251bebad8b8347d44ede4d698b43dc9
81cbcad7932114f5a824b65988df6327356a6124528e4d76e1ac4b54e887805b
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
833f45fc1beac7fade0751bd74893f26f4dd58009718428a51951fda08831f28
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
846949c5a40e3ffbb702473e54dfac0646541aa624a844369b6e24e51ddaf96b
8486c82ce9787d7bb2a032e5de11bf76cd2ab8be3032f2f294e9999bb89f4a4c
85bc560d0c69e06ee6b1bdb1cce58694b6fc19ca7598068158ff7a4de3d3c6d8
89c03f3d5c20fc7fb33474cb1afff2eece540a441b6cd977f3d8b5d8e0ac5545
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8e8e2814044ff1f3a9cba0f6ad010381574d223469e0eb2092ecb2a16ab4e814
8f8d8533c1c578b9407cec494b55969998d0f8916fe753931978da699b597b4b
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
95b19c951f8010a75196c9ef97e9ed4ac0bef10221a0e28f18441a29a5a4552b
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
96b34eeaf8520b91d67bb57b8bc953139aaa54f4a5e0a3f62866878f5a645c91
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9a0b20fad6f2ba7ae979144379f72dbe01be73478d0da22237b1e221f888182e
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a3eb852dd3cdb300c28ecc0fb07be579ac8e7ad196d282119b2681cc39745cef
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240
a9161d73cd6490abd72bc80bb1812c24ff04501c0cc458fa72a1df2cb96efa5c
aae78cf3b1dd9018e6e1c36ff993d0d1414f5cc0da316942e760bcadbf161626
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b74578b4537dcee4a4aaa9a18aec01ecebc76b3d35a15cc4507a1cfeca3a638e
bb7c8a563d7d215b6c66fa0fcc6d637ea9b8c1083de7ea83c51900eee4415d8a
bbcd9206f18adb2706e43a0992291fe729705c9559c5ab9485a370a39e9e6916
bc5c60270872a90bc01d1f4a3823237d34461878a38fd5adf18c02b3173404b0
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
c2461a2dbebcc3ea6e1a4de2017febaa462b38dd801c20c6ac4fae69446c74d8
c4fa3b2c71d1b1f1746a4487ce84258e19183285036bd01b14ae515d63741e1d
c65e80a3a68235b58e4ba1706c3d8bc9b8688cf1630189a24b1d731b2b9ad653
c6756941cbf7cdda404625e008c9f1436fbd5d57a6559c177971ff5c4cd7b9d9
d04ecd5fede0141fe8ff1fcc42d1f73cbf808d25cc6be9fe3d29d51b6f6f646e
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d6d8da7e164a270a65bb6be28fe504dc255b756bee5bdee986c83b7dc20eccef
db04805116903120f8993561fa2b65d27c430eab2ba24af2bf13a29f61e23a15
db87260506f0efeb56198fe74de79e4116081f3e6a00ce50e3bd71088ff239d2
dd393663ee4331edfa153519f0a4d33cc40f0d460e36ea0f800a5203e579bf7b
e1128c619d85bfee95f4329ff24900477b8bdba0c439a4494624ced4679e60aa
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e733efc482aadb49da8e01443e88c60b2d493e69060d80926a01f88a2f3194fd
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
e9d409d55f3f28fa7f5faf4a90dce3155884e547af168e8d6c07e56bf36022d8
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ea8845fef67005feffae85e04217c4bb0ae6309db8e09ea778ae55b03cf8b08e
ebe0d06023454b71e1aa256b52e5fdcab4871605f8b54de2a47a1628df1114f7
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec3c91d1c8911b1aba7e2ff73fa73bf3fe435f204e2cae30324c61e8ec949722
ecd31c35499276d34bebfe2272b8a76701bf22baf761978697369558a9b47f66
ed16c1f664eb713dc8773a346c8122cc5a3b85153188eb7a4ed9ac1ba6b26b1e
ed5f81f4053d02ce371787effafb34596a1f0285b67d33a98084d6b60de306ff
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f208071c0a1d85704129506a6e109e14ec3a772a66acb0baa6be4aef62a97810
f3e13da09f8db2744bc360cbd94ffc8ed73319122d7d184e85146742161a30d2
fa1ef5ada57aee13df27471b97964993e328305da6f3c7e5887bab16f2fd39ed
fbb05130132c5a9a055e5ef8a03c199db12f873d28d81e5e51430077e6095ced
fd71c84a3900681f976c49e89273d70813f2a9bc5893de416850c3c31210c104